2013-11-27 231 views
0
public int checkGuess(int g, int randomnumber){ 

    number=g; 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) 
     return 0; 

    else if (number < randomnumber) 
     return -1; 

    else if (number > randomnumber) 
     return 1; 

} 

爲什麼這會給我一個缺少的返回語句錯誤?每個if/else都有返回 錯誤出現在最後一個括號中缺少if/else語句的return語句

+2

應該在'else'內或在整個'if/else-if'之外進行返回 –

+0

因爲您遺漏了隱含else的返回語句。 –

回答

7

每個return語句都在if語句中。儘管編寫邏輯上不可能,但當if沒有任何一個值爲真時,編譯器需要返回。

我建議:

public int checkGuess(int number, int randomnumber){ 
    int retVal = 0; 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) { 
     retVal = 0; 
    } else if (number < randomnumber) { 
     retVal = -1; 
    } else if (number > randomnumber) { 
     retVal = 1; 
    } 
    return retVal; 
} 

該解決方案解決了編譯器的問題,稍微提高了可讀性,在我看來。


另外,有這樣的解決方案:

public int checkGuess(int number, int randomnumber){ 
    this.randomnumber= randomnumber; 

    if (number == randomnumber) { 
     return 0; 
    } else if (number < randomnumber) { 
     return -1; 
    } else if (number > randomnumber) { 
     return 1; 
    } else { 
     //throw an exception 
    } 
}  

拋出異常將讓你得到該方法沒有因爲按理說返回任何東西......,如果你到最後else,東西明顯出錯了。

+0

+1表示拋出異常,當你確信代碼無法訪問時,這確實是最好的選擇。 –

+0

+1對我來說''IllegalArgumentException'是最好的,如果你認爲這種方法不應該讓娛樂價值達不到某個定義的條件。 – Bnrdo

+0

僅僅因爲編譯器無法弄清楚只有三個可能性並不意味着程序員不能夠 –

3

您可以嘗試將las else if更改爲else

if (number == randomnumber) 
    return 0; 

else if (number < randomnumber) 
    return -1; 

else 
    return 1; 
+0

是的,我知道這個作品,但我認爲不是說,如果數字更大的回報1;弄亂測試儀文件。任何方式仍然有這種情況? – user3027772

+0

你可以使用評論來指出。 – Christian

0

你需要一個人對這一爲你期望的工作,它不評估你的條件,要知道,它總是返回

0

回報應在else內部或整個if/else-if之外進行。這是可能的回報不會與取決於條件的所有收益

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c; 

如果沒有條件1,2,3或符合會有不歸路做。應始終提供回報。因此,修復將是:要能找出你if/else樹是否涵蓋了所有可能的情況下

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c; 
else 
    return d; 

或者

if (condition 1) 
    return a; 
else if (condition 2) 
    return b; 
else if (condition 3) 
    return c 

return d; 
2

編譯器不是必需的。如果你可以編寫代碼,一些編譯器足夠聰明,可以發現沒有問題,而其他編譯器卻不行,那就太糟糕了。 Java並沒有精確地規定編譯器的精確程度,而是要求你編寫清晰,乾淨的代碼。

根據Java規範中的定義,該函數的大括號是可到達的。你可以證明它無法通過「可達」的其他定義訪問並不重要。 「可達」的Java規範概念是編譯器實際可以實現的規範中詳細解釋的形式概念。這不是「可達」的常識概念,無論如何,哪一個永遠不會教給計算機。

0

Java要求非void方法保證返回一些東西(即使它是null)。如果有if語句,按照定義,只有有時你的return語句被運行。

if(number == randomnumber) { 
    return 0; 
} else if(number < randomnumber) { 
    return -1; 
} else if(number > randomnumber) { 
    return 1; 
} else { 
    return -2; 
} 

else語句不是必需的,但它確實使它更易於理解imo。

+0

'else return -2;'在這裏相當sl in,在我看來並且阻礙了可讀性。這個答案確實解決了編譯器問題。 – nhgrif

2

基本上,編譯器不夠聰明,以至於number == randomnumber || number < randomnumber || number > randomnumber是一種重言式。由於您沒有else,它認爲有可能您將超過條件,然後在不返回的情況下擊中函數的結尾。最簡單的修復方法是將您最後的elseif更改爲else。從以前的條件你知道number > randomnumber必須是真實的,如果你到那一點。 (如果你是偏執狂,並要確保你可以添加一個斷言。)

1

沒有必要爲else一個return語句後:

if (number == randomnumber) 
    return 0; 

if (number < randomnumber) 
    return -1; 

// Must be true: if (number > randomnumber) 
return 1; 

注意的原因,這解決了問題因爲編譯器不檢查邏輯上必須返回的解決方案。例如而A必須> <或= B,它不檢查這種關係。它正在尋找明確涵蓋每條路徑的可能性。

+0

雖然不需要返回'else',但它有助於提高可讀性(尤其是在'if'主體更像一個簡單的'return 0;'的情況下。但是不管怎樣,這個部分與實際問題無關(雖然你發佈的代碼確實解決了問題......只是沒有解釋問題,留下了一個令人誤解的答案)。 – nhgrif

+0

@nhgrif添加了註釋來解釋爲什麼,還有'{}'使這個更清楚,有沒有別的。我沒有添加它們來突出顯示我正在呈現的差異。 –

+0

@nhgrif我相信當ELSE在IF-'return'語句後沒有使用時,代碼更具可讀性和邏輯性。 – MaxZoom