14

我最近在发布之前从我们的代码库中删除了一段代码,并使用了 if(false) 语句来阻止执行:

if (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

这编译得很好,并且会阻止执行有问题的代码块(对或错,这不是当前的论点)。

但是,有点偶然,我将上面的块更改为:

while (false) {
    ArrayList<String> list = new ArrayList<String>();
    ...
}

并收到无法访问的语句编译错误。

我很欣赏编译错误并理解其中的原因,但是,我很难理解这两个块之间的区别以及为什么前者编译得很好但后者在它们都有无法访问的语句时却不能。

4

2 回答 2

13

在这两种情况下,编译器都应该引发错误,因为大括号之间的代码本质上是没有意义的, if (false)保留在 Java 中以模拟 C/C++ 预处理器#if 0,这是禁用部分代码以进行测试或调试的一种非常常见的方法。

编辑:作为参考,Java 语言规范 第 14.21 章末尾详细介绍了“条件编译” 。

于 2013-05-08T14:19:07.517 回答
1

“Java 使用简单的流分析算法来查找最常见的无法访问代码的情况,所有这些无法访问的代码块都将被标记为编译时错误。这就是您的“while (false) { ... }”语句产生错误的原因.

但是,Java 对“if (false) { ... }”做了一个特殊的例外,因为程序员在开发过程中经常使用这种结构来临时禁用部分程序。这就是编译器接受此语句的原因。

如果您对细节感兴趣,请参阅 Java 语言规范对无法访问语句的描述 @ http://docs.oracle.com/javase/specs/#14.21。”

引自http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false

于 2013-05-08T14:43:13.680 回答