当我编译这段代码时
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;
}
}
它工作正常。
有人可以告诉我这种行为背后的原因。
答案 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){...}”语句产生错误的原因。