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

Java if(false)vs.while(false):无法访问的代码vs.死代码,java,dead-code,unreachable-code,Java,Dead Code,Unreachable Code,我在Eclipse中尝试了以下操作: if(false){}:警告“死代码” while(false){}:编译错误“无法访问代码” 我想知道这种差异是否有真正的“原因”。我已经找到了这个 …但是为什么不允许while(false)用于相同的调试目的呢?解释了基本原理。本质上,Java通常不应该像C一般使用#ifdef那样使用条件编译,但在某些情况下(例如调试,特别是向后二进制兼容性),需要允许编译器完全删除代码,因此特定的构造if(false)是允许用于此目的的。您必须阅读。虽然使用wh

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

  • if(false){}
    :警告“死代码”
  • while(false){}
    :编译错误“无法访问代码”
我想知道这种差异是否有真正的“原因”。我已经找到了这个

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

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

您必须阅读。虽然使用
while(false)
编译器将抛出一个错误,但是如果使用
if(false)
编译器将向用户显示一个警告

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

说明书上说:

如果(false){x=3;}

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

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

静态最终布尔调试=false;然后编写如下代码:

如果(DEBUG){x=3;},则想法是应该可以更改 DEBUG的值从false到true或从true到false,然后 正确编译代码,不对程序文本进行其他更改


但是,“DoWhile循环”将编译并执行

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

编译器不会为
if(false{}
)抛出错误。这就是重点。我仍然有否决票,因为编译器不会在
if(false)
@RahulTripathi
的情况下抛出错误,而(false)
是编译时错误。
if(false)
可能会产生警告,但明显不是编译时错误。@luukburger:-是的,你是正确的。我弄错了。我已经更新了我的答案以及编译器不会抛出错误的理由!值得注意的是,
if(compileTimeConstant){…}
作为构造是有意义的,而
while(true){…}
do{…}while(compileTimeConstant)
有意义,但是
while(compileTimeConstant){…}
在任何情况下都没有意义[除了文字-
true
one],如果(compileTimeConstant){while(true){}+1
那么为什么不允许while(false)呢出于同样的调试目的?
我没有得到那个部分?这是否意味着
if(false){}
是编译器“允许”不可访问代码的唯一例外?@NarendraPathai
而(false)
对于调试没有真正意义;在调试(或二进制兼容)中在这种情况下,您要么关闭分区,要么在不同版本之间切换(如Android兼容性库)。在这两种情况下,任何循环都将保持不变,最好将可达性规则的例外尽可能缩小。@luukburger不是
if(false)
字面意思,而是
if(编译时错误表达式)
@NarendraPathai在JLS:条件编译的链接段落末尾解释了原因