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

2022-09-04 03:01:50

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

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

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

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

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

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

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


答案 1

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

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


答案 2

“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


推荐