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

时间:2013-08-19 07:06:04

标签: 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
    }
  }
}

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

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

6 个答案:

答案 0 :(得分:12)

  

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

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

来自section 14.21 of the JLS

  

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

     

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

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

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

  

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

     

breakcontinuereturnthrow声明无法正常完成。

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

  

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

是编译器编译整个代码并根据您的代码生成字节代码,它更智能地检测unreachable code dead codebreak中的立即for-loop使其他语句无法访问。

for(;;){
   break;
   ... // unreachable statement
}


int i=1;
if(i==1)
  ...
else
  ... // dead code

答案 3 :(得分:2)

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

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

Unreachable code: error or warning?Why does Java have an "unreachable statement" compiler error?

答案 4 :(得分:1)

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

答案 5 :(得分:0)

编译器将检查某些关键字后是否有更多代码。如果您将break替换为return,则会产生类似消息的另一个关键字。