循环时无法访问代码
当我编译这段代码时
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){…}”语句产生错误的原因。