首页 > 解决方案 > 当 if 条件为常量时,为什么未检测到无法访问的代码?

问题描述

我正在学习 Java 考试,遇到了“无法访问的语句”编译器错误,例如:

Source.java:10: error: unreachable statement
       System.out.println("This code is not reachable");

我试图了解这种情况何时会发生或不会发生 - 例如,这些情况不会发生:

// Case #1
if (true) {
    System.out.println("This code is reachable");
} else {
    System.out.println("This code is not reachable"); // Compiles OK
}

// Case #2
for (i = 0; i < 5; i++) {
    if (true) continue;
    System.out.println("This code is not reachable"); // Compiles OK
}

编译器似乎不够聪明,无法检测if条件何时持续存在true- 有人可以提供更详细的解释吗?

标签: javaif-statementcompiler-errorsconditional-statementsunreachable-statement

解决方案


来自 Java 语言规范,14.21。无法到达的陈述(我强调):

如果由于无法访问而无法执行语句,则这是编译时错误。

本节专门对“可达”一词进行精确解释。这个想法是,从包含语句的构造函数、方法、实例初始化程序或静态初始化程序的开头到语句本身,必须有一些可能的执行路径。该分析考虑了语句的结构。除了对 条件表达式为真值的语句进行特殊处理外,流分析中不考虑表达式的whiledofor

因此,虽然代码确实无法访问,但编译器明确地不认为它是这样的。说明的原因是允许程序员定义“标志”变量,例如

static final boolean DEBUG = false;

if (DEBUG) { x=3; }

应该可以在代码之间进行切换DEBUG并且false不必true更改代码中的任何其他内容(由于编译错误)。


推荐阅读