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

luu*_*ger 25 java dead-code unreachable-code

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

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

我想知道这种差异是否存在真正的"原因".我已经发现了......

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

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

chr*_*ke- 30

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

  • +1`但为什么不允许while(false)用于相同的调试目的?`我没有得到那个部分? (3认同)
  • @luukburger不是`if(false)`字面意思,而是`if(compile-time-false-expression)`. (3认同)
  • 这是否意味着`if(false){}`是编译器'允许'无法访问代码的唯一例外? (2认同)
  • @NarendraPathai`而(false)`对调试没有意义; 在调试(或二进制兼容)情况下,您将关闭部分或在版本之间交替(例如Android兼容性库).在这两种情况下,任何循环都将保留在原位,并且最好将可达性规则的异常保持尽可能窄. (2认同)
  • @NarendraPathai为什么在JLS中的链接段落的末尾进行了解释:条件编译 (2认同)

Rah*_*thi 9

您必须阅读无法访问的语句.虽然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,然后正确编译代码而不对程序文本进行其他更改.