当前位置: 首页 > 知识库问答 >
问题:

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

拓拔骁
2023-03-14

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

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

我想知道这种差异是否有真正的“原因”。我已经找到这个。。。

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

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

共有3个答案

吕高雅
2023-03-14

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

do {
    System.out.println("its work!");
} while (false);                       //compile and execute
岳研
2023-03-14

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

虽然if(false)保留在Java模拟C/C预处理器#if 0

规范规定:

if(false){x=3;}

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

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

静态最终布尔值DEBUG=false;然后编写代码,例如:

if(DEBUG){x=3;}这个想法是应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码,而无需对程序文本进行其他更改。

董品
2023-03-14

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

 类似资料:
  • 问题内容: 我在Eclipse中尝试了以下方法: :警告“死代码” :编译错误“无法访问的代码” 我想知道这种差异是否存在真正的“原因”。我已经找到了… …但是为什么不允许相同的调试目的? 问题答案: 在上可达代码JLS部分解释了理由。本质上,Java通常不应该像C常规那样使用条件编译,但是在某些情况下(例如调试,尤其是向后二进制兼容性),需要允许编译器完全剥离代码,因此特定的结构为此被允许。

  • 问题内容: 在此NotePadProvider示例代码中,我注意到作者选择了以下形式: 过度: 第一种形式比更具逻辑性的形式有什么优势吗? 问题答案: 除了“可读性”之外,没有。它们在功能上是等效的。 (“可读性”用引号引起来,因为我讨厌并且发现它更具可读性。但是其他人则不然。)

  • 我遇到了一个奇怪的问题。我正在查询数据库表中的单词列表,并能够获得该列表。但是我无法更新该表。奇怪的是,logcat显示Code 14错误。我卸载了应用程序,重新运行它,所以数据库是新复制的,但是什么都没有改变。 以下是dbHandler代码: } 这是服务代码: 字符串兽医显示在烤面包中,我可以看到表格第一列中的所有单词。但是我无法更新行。 我已经给了它存储权限,并对其进行了双重检查。 清单文件

  • 问题内容: 我不明白“无法​​访问的代码”是什么意思? 在我的代码的最后一行中,它表示无法访问的代码。 } 问题答案: 这里的循环: 解析为,因为从未修改过的值。因此,(在您的情况下)之后出现的任何代码均被视为 无法访问 。

  • 我不知道发生了什么事情。即使条件是假的,if块中的代码仍然运行。我在netbeans IDE7.4中设计了我的界面,只需在Eclipse中复制粘贴设计。以下是我的代码 无论我在jinstrument jcombobox中选择什么,我都会得到“inside if”作为输出。我已经检查了print语句,但enterloop的值为0,它仍然进入if语句块。请帮助我解决这个问题

  • 问题内容: 和JPA持久性之间有什么区别? 问题答案: Gordon Yorke(EclipseLink体系结构委员会成员,TopLink核心技术负责人,JPA 2.0专家组成员)在此主题上写了一个很好的答案,因此,我不用表述他,而是引用他的答案: 和 之间的区别是评估它们的范围。’ ‘ 的定义讨论了属性和字段值,并建议应在运行时内评估此功能。“ ”仅指数据库列。 如果实现选择实现,则这些属性应由