【发布时间】:2021-08-29 04:31:13
【问题描述】:
在recent related 问题中我发现以下代码
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 运行时环境(内部版本 15.0.2+7-27)
OpenJDK 64 位服务器 VM(内部版本 15.0.2+7-27,混合模式,共享)
javac 15.0.2
视窗 10
【问题讨论】:
标签: java compiler-optimization causality internal-compiler-error