在最近的一个相关问题中,我发现以下代码
public static void main(String[] args) {
/*1*/ int x;
/*2*/ boolean found = false;
/*3*/ if (!found)
/*4*/ x = -1;
/*5*/ System.out.println(x);
}
有编译器错误 x 不是 init.(initialized)。我很惊讶编译器无法推理 init。特别是因为此代码似乎不需要任何运行时推理,如下所示:
- 在指示的第 2 行,
found
设置false
。 - 第 2 行和第 3 行之间没有代码。
- 所以到达第 3 行
!found
是必然的,true
所以 init 是不可避免的。
我想知道这是否正确。我依稀记得编译器优化可以改变语句的执行顺序。这在这里起作用吗?是否有可能在第 3 行和第 4 行之前到达第 5 行?
环境。
openjdk 15.0.2 2021-01-19
OpenJDK Runtime Environment (build 15.0.2+7-27)
OpenJDK 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
javac 15.0.2 Windows 10