2012-01-14 73 views
29

在以下方法中,编译器抱怨缺少返回语句,即使只有一条通过方法,并且它包含一个return语句。抑制错误需要另一个return声明。编译器抱怨“缺少返回语句”,即使不可能达到返回语句将丢失的情况

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

鉴于Java compiler can recognize infinite loops,为什么它不处理这种情况呢?链接的问题提示,但没有提供这个具体情况的细节。

+2

in'foo4()'编译器不那么聪明,它理解函数总是返回5.它只是检查并不是所有的代码路径都返回一些东西。 – 2012-01-14 16:51:06

+1

如果在流程分析中专门处理语句,请参阅JLS 14.21:* if语句,...以不常见的方式处理。出于这个原因,本节末尾会另行讨论* – irreputable 2012-01-14 18:05:23

+0

@irreputable将来,如果您想对问题结束提出异议,请考虑将帖子标记为主持人审核或发布在[meta]上。这比围绕侮辱人群或肆意破坏帖子更有建设性。 – 2012-01-14 18:38:29

回答

12

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进入重大的细节。

+0

+1 JLS参考。 – paislee 2012-01-14 18:51:54

+0

@DaveNewton:请更新第二个网址(链接的JLS部分的最后部分) – 2012-07-18 07:32:12

+0

@Nandkumar将它更新为什么? – 2012-07-18 12:13:19

5

之所以编译器抱怨有来自Section 14.21 of the Java Language Specification这个关键点做,讨论可达声明:

除的whiledo的特殊处理,与for语句,其条件表达式的常量值true,表达式的值在流分析中未被考虑。

注意if具有的true恒定条件下的特殊处理的语句之一。这个特殊处理被排除在外的原因是允许if作为条件编译的一种形式,正如戴夫牛顿在他的回答中所解释的那样。

+0

好点,我接受了@Dave Newton的回答,因为他也已经提到了好东西。非常感谢你。 – Lion 2012-01-16 17:12:29