繁体   English   中英

Java编译器/ Eclipse不调整死代码

[英]Java compiler/eclipse not reconizing dead code

所以我最近来了。 我正在创建一个if-else-statement,条件是最终的布尔变量。 Eclipse立即告诉我代码的其他部分无法访问,因此代码无效。 这是我的代码(紧凑)。

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");
    }
}

现在我想知道,为什么第一种情况没有被检测到并标记出来?

先感谢您。

试试这个作为替代。

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");
        }
    }
}

仍然没有警告。 为什么?

因为编译器不会执行您的代码。 仅当看到一些“常量”或“常量表达式”时,它才能发出警告。 显然,当您将finalfinal ,编译器便知道该值无法更改。 如果您使用“实变量”或“变量表达式”,则它不知道,因为它不执行您的代码(以查看此行的state(a+1)值)。 因此,在后一种情况下,您不会收到任何警告。 希望这现在更有意义。

这样考虑:编译器进行一些代码分析。 通过这种分析可以检测到第一个基本模式,而第二个则不是(可能不是那么基本)。

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

附带一提,您不必执行if(Boolean == true) ,而只需执行if(Boolean)

编译器对final变量进行了一些优化,如下所示,在这种情况下,编译器知道其他部分将永远无法实现,因为以后无法更改final变量。

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

阅读更多JLS§4.12.4。 最终变量

查找更多无法实现的代码编译器错误的可能性

第一个例子:

当我们将final关键字与变量一起使用并为该变量分配一个值时,该值将无法再次更改。 final boolean state = true; 它的值不能为“ false”。

第二个例子:

在这里变量state不是最终的。 它有可能获得“假”值。

因此,不同的行为是由于 final 关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM