Java中无法访问的语句编译错误

class For1 { public static void main(String args[]) { int a = 0; for(;;) { break; System.out.println(a); //Line 1 ++a;//Line 2 } } } 

我知道第1行/第2行永远不会执行。 但我仍然不明白为什么抛出编译时错误。 我得到“无法访问的声明”编译错误。

这是否意味着编译器检查它是否能够为所有分支/代码行编译?

这是否意味着编译器检查它是否能够为所有分支/代码行编译?

这意味着编译器会检查每个语句是否可访问。

从JLS第14.21节 :

如果由于无法访问语句而无法执行语句,则会发生编译时错误。

本节致力于对“可达”一词的精确解释。 我们的想法是,从构造函数,方法,实例初始化程序或包含语句本身的静态初始化程序开始,必须有一些可能的执行路径。 分析考虑了陈述的结构。

然后,该部分记录了如何定义可达性。

特别是,您案例中的相关要点是:

如果S之前的语句可以正常完成,则非空交换块中的每个其他语句S都是可到达的。

breakcontinuereturnthrow语句无法正常完成。

所以你的“第1行”语句前面有一个语句( break; ),它无法正常完成,因此无法访问。

编译器也能够得出这个结论,并假设你犯了一个错误。 是的,Java编译器进行了相当多的“数据流分析”。 最常见的相关消息是关于未初始化的变量的消息。 第二个最常见的是,我相信,恰恰是这个,关于代码无法访问。

这是否意味着编译器检查它是否能够为所有分支/代码行编译?

是编译器编译整个代码并根据您的代码生成字节代码,它更聪明地检测unreachable codedead codefor-loop中的立即break使其他语句无法访问。

 for(;;){ break; ... // unreachable statement } int i=1; if(i==1) ... else ... // dead code 

无法访问的代码毫无意义且冗余。 如果您的程序中有一些无法访问的代码,那么这是一个错误,需要修复。 因此编译器会抛出错误。

您可以参考下面的类似问题

无法访问的代码:错误或警告? 为什么Java有“无法访问的语句”编译器错误?

编译器能够确定永远不会执行这两个语句,并通过拒绝编译来帮助您编写正确的代码,因为这有99.9%的可能性是错误而不是有意识地选择添加永远不会发生的语句被执行。

编译器将检查某些关键字后是否有更多代码。 另一个会导致类似消息的关键字是你用return替换break