2012-01-14 75 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