Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环时无法访问的代码_Java_While Loop - Fatal编程技术网

Java 循环时无法访问的代码

Java 循环时无法访问的代码,java,while-loop,Java,While Loop,当我编译这段代码时 public static void main(String [] args) { int x = 0; while(false) { System.out.println(hello); } } 它显示编译时错误无法访问的代码 但是当我把代码修改为 public static void main(String

当我编译这段代码时

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;
        }
    }
很好用


谁能告诉我这种行为背后的原因。

在下面的语句中使用常量
false

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

但当您使用变量时:

    boolean result = false;
    while(result)

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

编译器的行为在Java语言规范第节中明确指定

以下是一段关键的引语,直接回答了您的问题:

本节将对“可访问”一词进行精确解释。其思想是,从包含语句的构造函数、方法、实例初始值设定项或静态初始值设定项的开头到语句本身,必须存在一些可能的执行路径。分析考虑了报表的结构。除了对while、do和条件表达式具有常数值true的语句进行特殊处理外,在流分析中不考虑表达式的值


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

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

final boolean result = false;
while(result) { x=4; }
但是,这将编译,因为结果不再是常量变量:

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

另请参阅:类似的讨论。

对于询问者来说可能太高级了,但是可以在调用
while(result)
之前,将
result
的值内存修改为true,从而在到达while循环中的代码时执行黑客攻击。这不能发生在
中,而(false)
,因此代码确实是不可访问的(编译器忽略它,甚至不将其转换为字节码)。@assylias ok,收回了关闭的votewhile这是Java,另请参见:-我怀疑推理是类似的。