我正在使用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建议,我及以上“此方法应返回String类型的结果”错误。
为什么最后一个return语句是死代码?是因为班级演员吗?假设doSomething()
可以返回null,如果你强制转换它会抛出一个类强制转换异常吗?
而且,为什么Eclipse建议我用导致死代码警告的内容修复错误?是因为Eclipse无法预测这个吗?
答案 0 :(得分:6)
您发布的代码中没有死代码。我能看到的唯一问题是:
if (myVar != null) {
return myVar;
}
当您返回MyInterface
时,您将返回String
。编译器会抱怨它,它是正确的。
此外,作为更好的选择,您不应该直接返回try
或catch
块内部,而是在此块之后设计一个位置以返回结果。这将使您的代码避免任何死代码编译器错误。你应该看起来像:
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;
}
答案 1 :(得分:2)
您最有可能在方法org.eclipse.jdt.annotation.NonNull
上使用Eclipse的注释domeSomething
。
在这种情况下,Eclipse编译器知道变量不引用null
,因此代码将返回变量(BTW:这是另一个编译器错误,因为变量不是{ {1}})或抛出一个将返回空字符串的异常。最后一行确实是死代码。因此,警告。
但是,删除最后一行会导致代码不符合JLS。因此,编译错误。