循环时无法访问代码

当我编译这段代码时

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

它工作正常。

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

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

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

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

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

另请参阅: 为什么Java编译器不理解此变量始终初始化? 进行类似的讨论。

在以下语句中使用常量false

  while(false) 

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

但是当你使用变量时:

  boolean result = false; while(result) 

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

编译器的行为在Java语言规范第14.21节中精确指定。 无法访问的语句 。

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

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

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