Java 错误:未解决的编译错误:无法访问循环的代码

Java 错误:未解决的编译错误:无法访问循环的代码,java,Java,我有以下几行代码 boolean b = false; for (int i = 0; b; i++) {} 它执行得很好 现在,如果我将上面的代码替换为 for (int i = 0; false; i++) {} 它给出->java.lang.Error:未解决的编译问题:无法访问的代码 为什么??请帮忙 foreach循环的第二个参数是一个条件。当此条件为true时,将执行循环。如果将false作为参数,它将永远不会执行,因此无法访问其中的代码 第一个有效而第二个无效的原因是编译器没有

我有以下几行代码

boolean b = false;
for (int i = 0; b; i++) {}
它执行得很好

现在,如果我将上面的代码替换为

for (int i = 0; false; i++) {}
它给出->java.lang.Error:未解决的编译问题:无法访问的代码


为什么??请帮忙

foreach循环的第二个参数是一个条件。当此条件为
true
时,将执行循环。如果将
false
作为参数,它将永远不会执行,因此无法访问其中的代码


第一个有效而第二个无效的原因是编译器没有检查
b
的值(或不能充分派生它),然而,当您明确地使用
false
时,条件并不含糊。

编译器不会抱怨如果您使用一个变量作为条件,因为它不会检查当执行到达循环时会有哪个值(这是运行时的工作),与硬代码相反,a
false
值。

基本上
b
在第一个代码中不是编译时,而
false
是编译时。如果将第一个代码中的布尔变量更改为:

final boolean b = false;

它也将无法编译,因为现在它是一个常量表达式,因为以后不能更改
b
的值。

当然!由于条件错误,循环体永远不会执行。因此,循环体和i++确实是不可访问的。无论如何,这样做有什么意义?

可能是因为
javac
在第一种情况下不会外推
b
,为什么要在代码中使用这些无用的循环?为了部分解释这一点,Java编译器(以及JVM的验证器,在单独的步骤中)必须跟踪代码的可能执行路径,并确定每个变量在程序中的每个点上可以具有的所有值。(出于系统完整性的原因,这比使用其他语言要严格得多。)如果无法访问代码,它可能(尽管在本例中不是这样)在无法进行有意义的数据流分析的情况下创建冲突。所以这些情况在所有情况下都被诊断为错误。@JonSkeet我在一次采访中发现了这一点。