[英]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;
}
}
如果DEBUG
是static final boolean true;
您可能认为编译器应该足够智能,以实现该方法将始终返回5
。 但如果将其更改为false
,则代码不再有效。
该方法必须对通过该方法的所有路径有效, 而不需要更改源代码 ,允许优化编译器省略字节码而无需源代码修改,无论标志的值如何。
链接的JLS部分的最后部分详细介绍了。
编译器抱怨的原因与Java语言规范的第14.21节中的这个关键点有关 ,讨论了无法访问的语句:
除了对
while
,do
和for
条件表达式具有常量值true
语句的特殊处理外,在流分析中不考虑表达式的值。
请注意, if
不是具有特殊处理true
常数条件的语句之一。 它是从这个特殊的处理排除的原因是允许if
用作条件编译的一种形式,戴夫牛顿在他的回答解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.