而(false)导致无法访问的语句编译错误

时间:2013-05-08 14:15:25

标签: java while-loop

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

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

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

然而,有点意外,我将上面的块改为:

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

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

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

2 个答案:

答案 0 :(得分:12)

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

编辑:作为参考,“条件编译”在Java语言规范的chapter 14.21末尾详细说明。

答案 1 :(得分: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