以下代码不会给出编译错误
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 致力于对“可达”一词的精确解释。这个想法是,从包含语句的构造函数、方法、实例初始值设定项或静态初始值设定项的开头到语句本身,必须存在一些可能的执行路径。分析考虑了陈述的结构。除了对条件表达式为常量 true 的 while、do 和 for 语句进行特殊处理外,在流程分析中不考虑表达式的值。
例如,Java 编译器将接受代码:
int n = 5;
while (n > 7) k = 2;
即使
n
的值在编译时已知并且原则上在编译时可以知道对 k
的赋值永远不会被执行。
本节中的规则定义了两个技术术语:
声明是否可达
语句能否正常完成
此处的定义仅允许语句在可达的情况下正常完成。
为了缩短规则的描述,习惯缩写“iff”用于表示“当且仅当”。
来源: