Java if(false)vs.while(false):无法访问的代码vs.死代码
我在Eclipse中尝试了以下操作: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
:警告“死代码”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:条件编译的链接段落末尾解释了原因