我想知道为什么Java中允许使用以下代码而不会出现编译错误?
在我看来,此代码通过不返回任何String
来中断方法签名。
有人可以解释我在这里缺少的东西吗?
public class Loop {
private String withoutReturnStatement() {
while(true) {}
}
public static void main(String[] a) {
new Loop().withoutReturnStatement();
}
}
答案 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
陈述