29

我在 Eclipse 中尝试了以下操作:

  • if (false) {}:警告“死代码”
  • while (false) {}:编译错误“无法访问的代码”

我想知道这种差异是否有真正的“原因”。我已经找到了这个...

无法访问的代码编译器错误

...但为什么不允许while (false)相同的调试目的?

4

3 回答 3

32

JLS 关于无法访问代码的部分解释了基本原理。本质上,Java 通常不应该像 C 一样使用条件编译#ifdef,但在某些情况下(例如调试,特别是向后二进制兼容性)需要允许编译器完全去除代码,因此特定的构造if(false)被允许用于该目的。

于 2013-11-30T11:57:59.910 回答
9

您必须阅读Unreachable Statements。虽然while(false)编译器会抛出错误,但会if(false)向用户显示警告。

虽然if (false)被保存在 Java 中以模拟 C/C++ 预处理器#if 0

规范说:

如果 (假) { x=3; }

不会导致编译时错误。优化编译器可能会意识到语句 x=3; 将永远不会被执行,并且可以选择从生成的类文件中省略该语句的代码,但是语句 x=3; 在此处指定的技术意义上,不被视为“无法访问”。

这种不同处理的基本原理是允许程序员定义“标志变量”,例如:

静态最终布尔调试 = 假;然后编写代码,例如:

如果(调试){ x=3; 这个想法是应该可以将 DEBUG 的值从 false 更改为 true 或从 true 更改为 false,然后正确编译代码,而无需对程序文本进行其他更改。

于 2013-11-30T11:58:34.460 回答
1

但是,“do-while 循环”将编译并执行。

do {
    System.out.println("its work!");
} while (false);                       //compile and execute
于 2020-12-04T11:12:27.113 回答