以下代码块给我一个编译时错误。
while(false)
{
System.out.println("HI");
}
该错误表明存在无法访问的语句。 但以下代码可以编译
boolean b=false;
while(b)
{
System.out.println("Hi");
}
我能想到的就是这个 -> In case-1 as false 是一个文字,所以编译器发现它无法访问,而 in case2 变量 b 在 while 条件 block 中在运行时被检查,所以没有编译错误?
最佳答案
编译器编写者无法决定将哪些条件标记为错误 - 规则位于 Java 语言规范中,对于此问题,请参见 14.21 Unreachable Statements .
相关句子是:“当且仅当 while 语句可达且条件表达式不是值为 false 的常量表达式时,所包含的语句可达。”
在每种情况下,您都有一个可达的 while 语句。在第一个版本中,false
是一个常量表达式,其值为 false,因此所包含的语句不被认为是可达的。在第二个版本中,b
根本不是常量表达式,因此所包含的语句被视为可访问。
将 final
添加到 b
的声明中会将 while 条件更改为值为 false 的常量表达式,从而使所包含的语句再次无法访问。
在 JLS 中指定什么是编译时错误、什么不是编译时错误的规则的好处是所有 Java 编译器都应该接受相同的程序集。规则一般不要求编译器做数据流分析,大概是为了限制编写编译器的成本和难度。
关于java - 令人困惑的 while block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18752999/