删除死代码会导致错误

时间:2014-09-01 07:20:36

标签: java eclipse eclipse-kepler spring-tool-suite dead-code

我正在使用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无法预测这个吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

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

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