无限循环打破方法签名没有编译错误

我想知道为什么下面的代码允许在Java中,没有得到编译错误? 在我看来,这个代码通过不返回任何String打破方法签名。 有人能解释我在这里错过了什么吗?

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

该方法的最后一个}是不可访问的 – 如果可能在不返回值的情况下到达方法的末尾,则只会得到一个编译错误。

这对于由于例外而导致方法结束不可达的情况更为有用

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

这个规则在JLS第8.4.7节中 :

如果一个方法被声明为返回types(§8.4.5),那么如果方法的主体可以正常完成(§14.1),则会发生编译时错误。

你的方法不能正常完成,所以没有错误。 重要的是,它不是不能正常完成,但规范认识到它不能正常完成。 从JLS 14.21 :

如果满足以下至less一个条件, while语句可以正常完成:

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

在你的情况下,条件expression式一个值为true的常量,并且没有任何break语句(可到达或否则),所以while语句不能正常完成。

  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声明