if(false)vs while(false):无法访问的代码与死代码

时间:2013-11-30 11:54:43

标签: java dead-code unreachable-code

我在Eclipse中尝试了以下内容:

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

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

Unreachable code compiler error

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

3 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:9)

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

尽管if (false)保留在Java中以模拟C / C ++预处理器#if 0

规范说:

  

if(false){x = 3; }

     

不会导致编译时错误。优化编译器可以   意识到声明x = 3;将永远不会被执行并且可能会选择   从生成的类文件中省略该语句的代码,但是   陈述x = 3;在技​​术上不被视为“无法到达”   这里指的是感觉。

     

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

     

static final boolean DEBUG = false;然后编写如下代码:

     

if(DEBUG){x = 3;这个想法是应该有可能改变   DEBUG的值从false到true或从true到false然后   正确编译代码而不对程序文本进行其他更改。

答案 2 :(得分:0)

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

do {
    System.out.println("its work!");
} while (false);                       //compile and execute