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

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

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

我想知道是否存在这种差异的真正“原因”。 我已经发现了……

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

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

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

您必须阅读无法访问的语句 。 虽然使用while(false)编译器会抛出错误,但if(false)它会向用户显示警告。

虽然在Java中保留if (false)来模拟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,然后正确编译代码而不对程序文本进行其他更改。