我在Eclipse中尝试了以下内容:
if (false) {}
:警告'死密码'while (false) {}
:编译错误'无法访问代码'我想知道这种差异是否存在真正的“原因”。我已经找到了......
Unreachable code compiler error
...但为什么不允许while (false)
用于相同的调试目的?
答案 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