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

Und*_*Dog 8 java unreachable-code

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

我知道第1行/第2行永远不会执行.但我仍然不明白为什么抛出编译时错误.我收到"无法访问的语句"编译错误.

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

Jon*_*eet 13

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

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

JLS第14.21节:

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

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

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

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

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

break,continue,return,或throw语句无法正常完成.

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


Mar*_*ssi 6

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