如果我尝试编译
for(;;)
{
}
System.out.println("End");
Java编译器会产生一个错误,说Unreacable语句
。但是如果我添加另一个“unreacable”(根据我的说法)中断
语句并使其:
for(;;)
{
if(false) break;
}
System.out.println("End");
它可以编译。为什么不产生错误?
来自JLS
如果以下至少一项为真,则if-then语句可以正常完成:
因此,如果(false),则允许。
这种“有条件编译”的能力对二进制兼容性有着重要的影响,并与之相关。如果编译了一组使用这种“flag”变量的类,并且省略了条件代码,那么以后仅分发包含该标志定义的类或接口的新版本是不够的。因此,对标志值的更改与先前存在的二进制文件不兼容。(这种不兼容性还有其他原因,例如在switch语句的case标签中使用常量;)
正如我在回答一个类似问题时所解释的,特定的构造if(编译时false)作为显式后门不受不可访问性规则的约束。在这种情况下,编译器会因此将您的中断视为可访问的。
该行为在JLS对无法访问语句的描述中定义:
如果可以访问if-then语句,则可以访问then语句。
因此,编译器确定then语句(break;
)是可访问的,而不管if中的条件如何。
再进一步强调一下我的:
如果以下至少一项为真,基本的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语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间: