繁体   English   中英

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

[英]Compiler complains about “missing return statement” even though it is impossible to reach condition where return statement would be missing

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

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

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

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

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

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

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

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

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

链接的JLS部分的最后部分详细介绍了。

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

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

请注意, if 不是具有特殊处理true常数条件的语句之一。 它是从这个特殊的处理排除的原因是允许if用作条件编译的一种形式,戴夫牛顿在他的回答解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM