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

Lio*_*ion 29 java

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

public int foo() {
    if (true) {
        return 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于Java编译器可以识别无限循环,为什么它也不能处理这种情况呢?链接的问题提示,但不提供此特定情况的详细信息.

Dav*_*ton 13

JLS 14.21,无法访问的语句是处理此问题的部分:

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

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

public int foo() {
    if (DEBUG) {
        return 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果DEBUGstatic final boolean true;,你可能会认为编译器应该足够聪明实现方法将总是返回5.但如果改为false,则代码不再有效.

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

链接JLS节的尽头去到显著的细节.


Ted*_*opp 5

编译器抱怨的原因与Java语言规范的第14.21节中的这个关键点有关,讨论了无法访问的语句:

除特殊处理的while,dofor语句其条件表达式具有恒定值true,表达式的值不考虑在流分析.

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