循环时无法访问代码

时间:2014-01-04 14:46:17

标签: java while-loop

当我编译这段代码时

public static void main(String [] args) {

        int x = 0;        

        while(false)
        {                        
            System.out.println(hello);
        }
    }

显示编译时错误无法访问的代码。

但是当我将此代码修改为

public static void main(String [] args) {

        int x = 0;        
        boolean result = false;
        while(result)
        {                        
            x=4;
        }
    }

它工作正常。

有人可以告诉我这种行为背后的原因。

4 个答案:

答案 0 :(得分:9)

这是因为boolean result = false不是常量表达式,而false是。{1}}。如果您尝试下面的代码,它将无法编译,因为result现在是一个常量:

final boolean result = false;
while(result) { x=4; }

但是这会编译,因为结果不再是常量变量:

final boolean result;
result = false;
while(result) { x=4; }

另见:Why does the Java compiler not understand this variable is always initialized?进行类似的讨论。

答案 1 :(得分:6)

在以下语句中使用常量false

  while(false)

在编译时被解析为false,因此编译器会抱怨无法访问的代码。

但是当你使用变量时:

    boolean result = false;
    while(result)

编译器在编译时不确定它的值,因此不会抱怨。

答案 2 :(得分:4)

编译器的行为在Java语言规范的14.21. Unreachable Statements部分中精确指定。

这是一个关键引用,直接解决了您的问题:

  

本节致力于对“可达”一词的精确解释。我们的想法是,从构造函数,方法,实例初始化程序或包含语句本身的静态初始化程序开始,必须有一些可能的执行路径。分析考虑了陈述的结构。除了对while,do和for条件表达式具有常量值true的语句的特殊处理外,在流分析中不考虑表达式的值。

答案 3 :(得分:1)

Java使用简单的流分析算法来查找最常见的无法访问代码的情况,所有这些无法访问的代码块都将被标记为编译时错误。这就是你的“while(false){...}”语句产生错误的原因。