java 编译器是否理解 if 语句中给出的条件?

Does the java compiler understand conditions given in if statements?

下面的代码没有给出编译错误Unreachable statement.

if(true)return;
int x;

多年来我一直认为这是因为编译器不太注意给定的条件。

今天发现编译器懂条件了,

int x;
if (true) {
    x = 0;
}
int y = x;

因为如果不这样做,这将导致另一个编译错误 variable x might not have been initialized。实际上可以完美地编译和运行。所以,

java 编译器是否理解 if 语句中给出的条件?

Unreachable Statements专门对这个词进行了精确的解释"reachable."的思想是从构造器、方法开始肯定有一些可能的执行路径、实例初始值设定项或包含语句本身的静态初始值设定项。分析考虑了语句的结构。除了while、do、for条件表达式的常量值为true的语句特殊处理外,流分析不考虑表达式的取值。

例如,Java 编译器将接受代码:

int n = 5;
while (n > 7) k = 2;

即使 n 的值在编译时已知并且原则上 在编译时可以知道对 k 的赋值永远不会执行.

本节中的规则定义了两个技术术语:

  • 语句是否可达

  • 语句是否能正常完成

这里的定义允许语句只有在可达时才能正常完成。

为缩短规则描述,习惯缩写"iff"表示"if and only if."


来源: