在以下方法中,編譯器抱怨缺少返回語句,即使只有一條通過方法,並且它包含一個return
語句。抑制錯誤需要另一個return
聲明。編譯器抱怨「缺少返回語句」,即使不可能達到返回語句將丟失的情況
public int foo() {
if (true) {
return 5;
}
}
鑑於Java compiler can recognize infinite loops,爲什麼它不處理這種情況呢?鏈接的問題提示,但沒有提供這個具體情況的細節。
在以下方法中,編譯器抱怨缺少返回語句,即使只有一條通過方法,並且它包含一個return
語句。抑制錯誤需要另一個return
聲明。編譯器抱怨「缺少返回語句」,即使不可能達到返回語句將丟失的情況
public int foo() {
if (true) {
return 5;
}
}
鑑於Java compiler can recognize infinite loops,爲什麼它不處理這種情況呢?鏈接的問題提示,但沒有提供這個具體情況的細節。
JLS 14.21, Unreachable Statements是與此交易的部分:
if語句,它是否有一個else部分,是一個不尋常的方式處理。出於這個原因,本節末尾會分別討論它。
最終它與處理條件編譯的方式有關。考慮一下這個方法:
public int foo() {
if (DEBUG) {
return 5;
}
}
如果DEBUG
是static final boolean true;
你可能會認爲編譯器應該足夠聰明實現方法將總是返回5
。但是,如果它更改爲false
,則代碼不再有效。
該方法必須對通過方法的所有路徑有效,且不更改源代碼,允許優化編譯器省略字節碼而無需源修改,無論該標誌的值如何。
該very end of the linked JLS section進入重大的細節。
+1 JLS參考。 – paislee 2012-01-14 18:51:54
@DaveNewton:請更新第二個網址(鏈接的JLS部分的最後部分) – 2012-07-18 07:32:12
@Nandkumar將它更新爲什麼? – 2012-07-18 12:13:19
之所以編譯器抱怨有來自Section 14.21 of the Java Language Specification這個關鍵點做,討論可達聲明:
除的
while
,do
的特殊處理,與for
語句,其條件表達式的常量值true
,表達式的值在流分析中未被考慮。
注意if
是不具有的true
恆定條件下的特殊處理的語句之一。這個特殊處理被排除在外的原因是允許if
作爲條件編譯的一種形式,正如戴夫牛頓在他的回答中所解釋的那樣。
好點,我接受了@Dave Newton的回答,因爲他也已經提到了好東西。非常感謝你。 – Lion 2012-01-16 17:12:29
in'foo4()'編譯器不那麼聰明,它理解函數總是返回5.它只是檢查並不是所有的代碼路徑都返回一些東西。 – 2012-01-14 16:51:06
如果在流程分析中專門處理語句,請參閱JLS 14.21:* if語句,...以不常見的方式處理。出於這個原因,本節末尾會另行討論* – irreputable 2012-01-14 18:05:23
@irreputable將來,如果您想對問題結束提出異議,請考慮將帖子標記爲主持人審覈或發佈在[meta]上。這比圍繞侮辱人羣或肆意破壞帖子更有建設性。 – 2012-01-14 18:38:29