java – 编译器抱怨“丢失返回语句”,即使不可能达到返回语句将丢失的条件

在下面的方法中,编译器会报告一个缺少的返回语句,即使只有一个路径通过该方法,并且它包含一个return语句。抑制错误需要另一个return语句。

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

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

最佳答案
JLS 14.21, Unreachable Statements是处理这一点的部分:

The if statement, whether or not it has an else part, is handled in an unusual manner. For this reason, it is discussed separately at the end of this section.

最终它与如何处理条件编译有关。考虑这个方法:

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

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

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

very end of the linked JLS section进入了重要的细节。

转载注明原文:java – 编译器抱怨“丢失返回语句”,即使不可能达到返回语句将丢失的条件 - 代码日志