Java编译器/ eclipse无法识别死代码

时间:2014-06-14 12:49:59

标签: java eclipse if-statement compiler-warnings final

所以我最近来了这个。我创建了一个if-else语句,因为它的条件是最终的布尔变量。 Eclipse立刻告诉我,代码的else部分是无法访问的,因此死代码。这是我的代码(压缩)。

public static void main(String[] args){
    final boolean state = true;
    if(state == true){
        System.out.println("A");
    }else{
        System.out.println("B");
    }
}

然后我会发现,如果代码保持不变但变量不再是最终会发生什么?所以我试过了,这就是发生的事情,没有任何警告或错误。代码:

public static void main(String[] args){
    boolean state = true;
    if(state == true){
        System.out.println("A");
    }else{
        System.out.println("B");
    }
}

现在我想知道,为什么第一个案件被检测到并被标记,第二个案件没有?

提前谢谢。

4 个答案:

答案 0 :(得分:2)

尝试此选择。

public class Test061 {
    public static void main(String[] args){
        int a = 0;
        if(1 == (a+1)){
            System.out.println("A");
        }else{
            System.out.println("B");
        }
    }
}

仍然没有警告。为什么呢?

因为编译器不执行您的代码。它只能在看到一些"常数"时发出警告。或"常数表达式"。显然,当您放置final编译器时,就知道该值不能改变。如果你使用"真实变量"或者"变量表达式",它不知道,因为它没有执行你的代码(看看state(a+1)在这一行的价值是什么)。所以在后一种情况下,你没有得到任何警告。希望现在更有意义。

以这种方式思考:编译器进行一些代码分析。第一个基本模式是通过此分析检测到的,而第二个模式则不是(可能因为它不是那个基本模式)。

答案 1 :(得分:1)

final表示某些内容无法更改,因此可能会被标记,因为它永远不会且永远不会达到else语句。

另一方面,您永远不必if(Boolean == true) if(Boolean)

答案 2 :(得分:1)

编译器对final变量进行了一些优化,如下所示,在这种情况下,编译器知道其他部分永远不会到达,因为final变量以后不能更改。

if (true) {
    System.out.println("A");
} else {
    System.out.println("B");
}

了解更多JLS §4.12.4. final Variables

查找Unreachable code compiler error

的更多可能性

答案 3 :(得分:1)

第一个例子:

当我们对变量使用final关键字并为变量赋值时,该值不能再次更改。 final boolean state = true;它的值不能为" false"。

第二个例子:

此处变量state不是最终的。它有可能获得" false"。

的值

所以不同的行为是因为 final 关键字。