编译器抱怨“缺少返回语句”,即使无法达到返回语句丢失的条件

时间:2012-01-14 16:46:12

标签: java

在下面的方法中,编译器抱怨缺少return语句,即使该方法只有一条路径,并且它包含return语句。抑制错误需要另一个return语句。

public int foo() {
    if (true) {
        return 5;
    }
}

鉴于Java compiler can recognize infinite loops,为什么不处理这种情况呢?链接的问题提示,但没有提供此特定案例的详细信息。

2 个答案:

答案 0 :(得分:13)

JLS 14.21, Unreachable Statements是处理此问题的部分:

  

if语句,无论是否有else部分,都以不寻常的方式处理。因此,本节末尾将单独讨论。

最终它与处理条件编译的方式有关。考虑这种方法:

public int foo() {
    if (DEBUG) {
        return 5;
    }
}

如果DEBUGstatic final boolean true;,您可能认为编译器应该足够智能,以实现该方法将始终返回5。但如果它更改为false,则代码不再有效。

该方法必须对方法的所有路径都有效,无需更改源代码,允许优化编译器省略字节码而无需源代码修改,无论标志的值如何。

very end of the linked JLS section详细介绍。

答案 1 :(得分:5)

编译器抱怨的原因与Section 14.21 of the Java Language Specification中的关键点有关,讨论了无法访问的语句:

  

除了whiledofor语句的特殊处理,其条件表达式具有常量值true,表达式的值不会被考虑在内在流量分析中。

请注意,if 其中一个对true常量条件有特殊处理的语句。它被排除在这种特殊处理之外的原因是允许if被用作条件编译的一种形式,正如Dave Newton在他的回答中所解释的那样。