无限循环打破方法签名没有编译错误
我想知道为什么下面的代码允许在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
声明