java - 当 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
- 有人可以提供更详细的解释吗?
解决方案
来自 Java 语言规范,14.21。无法到达的陈述(我强调):
如果由于无法访问而无法执行语句,则这是编译时错误。
本节专门对“可达”一词进行精确解释。这个想法是,从包含语句的构造函数、方法、实例初始化程序或静态初始化程序的开头到语句本身,必须有一些可能的执行路径。该分析考虑了语句的结构。除了对 条件表达式为真值的语句进行特殊处理外,流分析中不考虑表达式的
while
值do
for
。
因此,虽然代码确实无法访问,但编译器明确地不认为它是这样的。说明的原因是允许程序员定义“标志”变量,例如
static final boolean DEBUG = false;
if (DEBUG) { x=3; }
应该可以在代码之间进行切换DEBUG
并且false
不必true
更改代码中的任何其他内容(由于编译错误)。
推荐阅读
- erlang - 如何integration_test那种genserver?正确使用assert_receive?
- c++ - 在异常期间 C++ 堆栈展开期间,本地异常值存储在哪里
- archicad - 为 Archicad 22 创建基本插件
- c - 无法在赋值中将 'float*' 转换为 'float'
- java - 如何从一组角色中只获得一个角色
- vb.net - 按数字字段过滤 DataView
- javascript - UI 上的 POST 方法
- c - 如何从单独的函数中解析命令行参数
- swift - 在 IBAction 函数中调用 locationManager
- apache-kafka - 按多个字段聚合并映射到一个结果