在下面的方法中,编译器抱怨缺少return语句,即使该方法只有一条路径,并且它包含return
语句。抑制错误需要另一个return
语句。
public int foo() {
if (true) {
return 5;
}
}
鉴于Java compiler can recognize infinite loops,为什么不处理这种情况呢?链接的问题提示,但没有提供此特定案例的详细信息。
答案 0 :(得分:13)
JLS 14.21, Unreachable Statements是处理此问题的部分:
if语句,无论是否有else部分,都以不寻常的方式处理。因此,本节末尾将单独讨论。
最终它与处理条件编译的方式有关。考虑这种方法:
public int foo() {
if (DEBUG) {
return 5;
}
}
如果DEBUG
为static final boolean true;
,您可能认为编译器应该足够智能,以实现该方法将始终返回5
。但如果它更改为false
,则代码不再有效。
该方法必须对方法的所有路径都有效,无需更改源代码,允许优化编译器省略字节码而无需源代码修改,无论标志的值如何。
答案 1 :(得分:5)
编译器抱怨的原因与Section 14.21 of the Java Language Specification中的关键点有关,讨论了无法访问的语句:
除了
while
,do
和for
语句的特殊处理,其条件表达式具有常量值true
,表达式的值不会被考虑在内在流量分析中。
请注意,if
不其中一个对true
常量条件有特殊处理的语句。它被排除在这种特殊处理之外的原因是允许if
被用作条件编译的一种形式,正如Dave Newton在他的回答中所解释的那样。