luu*_*ger 25 java dead-code unreachable-code
我在Eclipse中尝试了以下内容:
if (false) {}:警告'死码'while (false) {}:编译错误'无法访问的代码'我想知道这种差异是否存在真正的"原因".我已经发现了......
...但为什么不允许while (false)相同的调试目的?
chr*_*ke- 30
关于无法访问的代码的JLS部分解释了基本原理.从本质上讲,Java通常不应该像C一样使用条件编译#ifdef,但是在某些情况下(例如调试,特别是向后二进制兼容)允许编译器完全去掉代码是必要的,因此特定的构造if(false)被允许用于此目的.
您必须阅读无法访问的语句.虽然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,然后正确编译代码而不对程序文本进行其他更改.