无限循环中断方法签名,无编译错误

2022-08-31 15:11:27

我想知道为什么在Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回任何.有人可以解释一下我在这里错过了什么吗?String

public class Loop {

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

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

答案 1

该方法的最后一个无法访问 - 仅当有可能在不返回值的情况下到达方法的末尾时,才会收到编译错误。}

这对于由于异常而无法访问方法的末尾的情况更有用,例如

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

JLS 第 8.4.7 节中对此有规定:

如果将方法声明为具有返回类型 (§8.4.5),则当该方法的主体可以正常完成时 (§14.1)时,会发生编译时错误。

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

语句可以正常完成,但至少满足以下一项:while

  • 该语句是可访问的,并且条件表达式不是具有值 的常量表达式 (§15.28)。whiletrue
  • 有一个可访问的语句退出该语句。breakwhile

在你的例子中,条件表达式一个带值的常量,并且没有任何语句(可访问或其他),因此语句无法正常完成。truebreakwhile


答案 2
 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


推荐