【问题标题】:Unreachable statement compile error in Java [duplicate]Java中无法访问的语句编译错误[重复]
【发布时间】:2013-08-19 07:06:03
【问题描述】:
class For1
{
  public static void main(String args[])
  {
    int a = 0;
    for(;;)
    {
      break;
      System.out.println(a); //Line 1
      ++a;//Line 2
    }
  }
}

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

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

【问题讨论】:

标签: java unreachable-code


【解决方案1】:

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

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

来自section 14.21 of the JLS:

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

本节专门对“可达”一词进行精确解释。这个想法是,从包含语句的构造函数、方法、实例初始化程序或静态初始化程序的开头到语句本身,必须有一些可能的执行路径。分析考虑了语句的结构。

该部分随后记录了可达性是如何定义的。

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

如果 S 之前的语句可以正常完成,则非空块中不是 switch 块的所有其他语句 S 都是可访问的。

break、continue、return 或 throw 语句无法正常完成。

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

【讨论】:

  • 这里的 if 语句中的这个块(ideone.com/pMRqwz)永远不会到达。但是java编译器不会抛出unreachable statement error
  • @SivaPraveen 是的,因为就纯语言而言,该声明并非不可访问。我们可以说它永远不会被访问,但这与语言规则使其无法访问不同。
  • 谢谢。该语句无法访问,程序运行良好。但是,这在我们的代码中是无用的部分。几个问题? 1. 哪里可以看到java规则 2. 有没有可以识别各种不可达语句的库?
  • @SivaPraveen:Java 语言规范位于docs.oracle.com/javase/specs/jls/se10/html/index.html。我怀疑,识别所有种无法访问的语句将是图灵完备的任务——但很可能有工具可以帮助识别常见问题。不过,我不知道它们是什么——我会做与你一样的研究。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-10-31
            • 2016-03-30
            • 1970-01-01
            • 2013-05-02
            • 2011-04-17
            • 2023-04-06
            • 2012-12-09
            • 1970-01-01
            • 2013-08-17
            相关资源
            最近更新 更多