无限循环中断方法签名而没有编译错误

时间:2014-08-06 07:24:31

标签: java compilation infinite-loop

我想知道为什么Java中允许使用以下代码而不会出现编译错误? 在我看来,此代码通过不返回任何String来中断方法签名。 有人可以解释我在这里缺少的东西吗?

public class Loop {

  private String withoutReturnStatement() {
    while(true) {}
  }

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}

2 个答案:

答案 0 :(得分:83)

该方法的最终}无法访问 - 如果可以在不返回值的情况下到达方法的末尾,则只会出现编译错误。

这对于由于异常导致方法结束无法访问的情况更有用,例如

private String find(int minLength) {
    for (String string : strings) {
        if (string.length() >= minLength) {
            return string;
        }
    }
    throw new SomeExceptionIndicatingTheProblem("...");
}

此规则在JLS section 8.4.7

  

如果声明方法具有返回类型(第8.4.5节),则如果方法体可以正常完成(第14.1节),则会发生编译时错误。

您的方法无法正常完成,因此没有错误。重要的是,它不仅仅是它无法正常完成,而且规范识别它无法正常完成。来自JLS 14.21

  

如果至少满足下列条件之一,则while语句可以正常完成:

     
      
  • while语句是可以访问的,条件表达式不是值为true的常量表达式(第15.28节)。
  •   
  • 有一个可访问的break语句退出while语句。
  •   

在您的情况下,条件表达式一个值为true的常量,并且没有任何break语句(可达或其他),因此{{1语句无法正常完成。

答案 1 :(得分:22)

 private String withoutReturnStatement() {
    while(true) {
        // you will never come out from this loop
     } // so there will be no return value needed
    // never reach here ===> compiler not expecting a return value
  }  

要进一步澄清,请尝试此

private String withoutReturnStatement() {
    while(true) {}
    return ""; // unreachable
}

它说unreachable陈述