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

为什么Java编译器不会为不可访问的then语句生成不可访问的语句错误?

逄皓轩
2023-03-14

如果我尝试编译

for(;;)
{

}
System.out.println("End");

Java编译器会产生一个错误,说Unreacable语句。但是如果我添加另一个“unreacable”(根据我的说法)中断语句并使其:

for(;;)
{
    if(false) break;
}
System.out.println("End");

它可以编译。为什么不产生错误?

共有3个答案

艾自强
2023-03-14

来自JLS

如果以下至少一项为真,则if-then语句可以正常完成:

因此,如果(false),则允许。

这种“有条件编译”的能力对二进制兼容性有着重要的影响,并与之相关。如果编译了一组使用这种“flag”变量的类,并且省略了条件代码,那么以后仅分发包含该标志定义的类或接口的新版本是不够的。因此,对标志值的更改与先前存在的二进制文件不兼容。(这种不兼容性还有其他原因,例如在switch语句的case标签中使用常量;)

欧阳向文
2023-03-14
匿名用户

正如我在回答一个类似问题时所解释的,特定的构造if(编译时false)作为显式后门不受不可访问性规则的约束。在这种情况下,编译器会因此将您的中断视为可访问的。

程飞星
2023-03-14

该行为在JLS对无法访问语句的描述中定义:

如果可以访问if-then语句,则可以访问then语句。

因此,编译器确定then语句(break;)是可访问的,而不管if中的条件如何。

再进一步强调一下我的:

如果以下至少一项为真,基本的for语句可以正常完成:

  • for语句是可访问的,有一个条件表达式,条件表达式不是值为true的常量表达式(§15.28)
  • 有一个可访问的break语句退出for语句

因此for可以正常完成,因为then语句包含一个break。正如您所注意到的,如果将“中断”替换为“返回”,则它将不起作用。

基本原理将在本节末尾解释。实质上,if有一种特殊的处理方法,允许构造如下:

if(DEBUG) { ... }

其中DEBUG可能是编译时常量。

 类似资料:
  • 问题内容: 我经常在调试程序时发现在代码块中插入return语句很方便(尽管可能是不好的做法)。我可能会在Java中尝试类似的方法.... 当然,这会产生编译器错误。 Test.java:7:无法访问的语句 我能理解为什么警告是合理的,因为有未使用的代码是不好的做法。但是我不明白为什么这需要产生一个错误。 这只是Java试图成为一个保姆,还是有充分的理由使它成为编译器错误? 问题答案: 因为无法到

  • 本文向大家介绍Java中无法访问的语句错误,包括了Java中无法访问的语句错误的使用技巧和注意事项,需要的朋友参考一下 由于多种原因导致无法编译代码时,发生无法访问的代码错误,其中包括:无限循环,无法访问的代码行之前的return语句。 让我们看一个例子- 示例 输出结果 名为Demo的类包含主函数,并定义了一个值,并检查该值并运行空的“ for”循环。如果找到该值,则控件会跳出循环,否则将显示一

  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 实体或字段可以映射到/字段,例如,可以映射到: 然而,生成的实现类不包括类的任何导入语句,尽管它存在于抽象类中,因此代码不编译: 为什么会这样?我做错了吗?怎么解决这个? Edit2:在MapStruct的Github上发布了这个问题:https://Github.com/mapstruct/mapstruct/issues/844

  • 给出这段代码,其中包含一个类及其方法.这是我们的主要关注点: 在IntelliJ IDEA中运行此代码不会返回任何编译错误,但会成功返回输出。我的问题是:为什么这不是一个不可达的语句? 删除语句后运行循环(但保留如下所示: (...)会返回这样的错误,因为最后的< code>sout永远不会被打印出来。为什么第一种情况也不会出现这种情况?我确信这不是运行时的问题,因为编译器肯定看到整数< code

  • 对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间: