2014-09-01 101 views
1

我使用Eclipse 4.3 Kepler(实际上是STS 3.6.1)。删除死代码导致错误

我碰到了一些代码:

private String someMethod(String myParam) { 
    try { 
     MyInterface myVar = (MyInterface) domeSomething(myParam); 
     if (myVar != null) { 
      return myVar.methodThatReturnsString(); 
     } 
    } catch (Exception e) { 
     return ""; 
    } 
    return ""; // eclipse marks this as dead code 
} 

(正如你所期望的,doSomething()方法抛出一些异常,并返回一个接口要比MyInterface比较一般。)

Eclipse中强调了最后返回语句为死代码,如果我删除它作为quickfix建议,我和“这种方法应该返回一个字符串类型的结果”错误。

为什么最后一个return语句无效代码?是因为班级演员?假设doSomething()可以返回null,如果你投了它,会抛出一个类抛出异常吗?

而且,Eclipse为什么建议我修复导致死代码警告的错误?是否因为Eclipse无法预测这一点?

+0

删除'catch'块中的'return'“'。请注意,'someMethod'除了'String',但你正在尝试返回'MyInterface' ...好像你有更大的问题 – MadProgrammer 2014-09-01 07:23:35

+0

真的很抱歉那个错误,它确实返回一个String。现在更正:) – eivamu 2014-09-01 07:27:19

+0

完全不同的东西:我喜欢你的标志! – Seelenvirtuose 2014-09-01 07:34:45

回答

6

您的发布代码中没有死代码。我能看到的唯一的问题是在这里:

if (myVar != null) { 
    return myVar; 
} 

你返回一个MyInterface时,你应该返回String。编译器会抱怨它,这是正确的。

此外,作为一个更好的选择,您不应该直接返回trycatch块内,而应在该块之后设计一个位置以返回结果。这将使您的代码避免任何死代码编译器错误。你可能应该是这样的:

private String someMethod(String myParam) { 
    String result = ""; 
    try { 
     MyInterface myVar = (MyInterface) domeSomething(myParam); 
     if (myVar != null) { 
      result = myVar.methodThatReturnsString(); 
     } 
    } catch (Exception e) { 
     //handle the exception 
     //basic handling shown 
     System.out.println("Warning. There was a problem executing someMethod:"); 
     e.printStacktrace(); 
    } 
    return result; 
} 
+0

真的很抱歉,我的文章有错误。它应该返回一个字符串。现在更正。再一次,对不起:) – eivamu 2014-09-01 07:26:40

+1

@eivamu无论如何。这是你代码中唯一的*问题*。除此之外,请按照我的帖子的最后部分。 – 2014-09-01 07:28:14

+1

+1为一个入口,一个出口:) – MadProgrammer 2014-09-01 07:28:43

2

您最有可能使用的方法domeSomething Eclipse的注解org.eclipse.jdt.annotation.NonNull

在这种情况下,Eclipse编译器知道变量没有引用null,因此代码将返回变量(BTW:这是另一个编译器错误,因为该变量不是String类型)或抛出一个将返回空字符串的异常。最后一行确实是死代码。因此,警告。

但是,删除最后一行会导致代码不符合JLS。因此,编译器错误。

+0

情况并非如此(不使用Eclipse注释),但在类似情况下可能会出现这种情况,所以非常感谢您提供了有用的建议。 – eivamu 2014-09-01 08:37:04