2012-12-01 55 views
2

我想講一個小動物的程序,從四個選項中隨機選擇攻擊類型;我原本以爲我的return語句基地覆蓋,但我碰到一個drjava「失蹤return語句」錯誤:缺少return語句錯誤的if-then樹

public Attack fight(String opponent) { 
    int fightChoice = new Random().nextInt(4); 

    if(fightChoice == 0){ 
    return Attack.ROAR; 
    } if(fightChoice == 1){ 
    return Attack.POUNCE; 
    } if(fightChoice == 2){ 
    return Attack.SCRATCH; 
    } if(fightChoice == 3){ 
    return Attack.FORFEIT; 
    } 
} 

任何想法,爲什麼這可能是?

+0

這是使用[switch語句](http://www.leepoint.net/notes-java/flow/switch/switch-general.html)的好例子。 –

回答

1

您需要的if語句之外的失蹤聲明。舉例來說,如果flightChoice == 4,沒有一個if條件將舉行,所以你應該在方法的末尾添加return。這個return語句必須返回類似Attack的東西,如if分支。

1

您可能會認爲您的如果聲明涵蓋所有可能的情況,但編譯器只是編譯代碼,不會涵蓋/計算可能性。您需要在最後if語句後添加return聲明。

1

試想,當你沒有的if conditiontrue會發生什麼?在這種情況下,您不會從該方法返回任何內容。

你應該從你的方法可以按照每一條路徑返回,否則你會得到missing return語句錯誤。

  • 你可以讓你的if'sif-else if塊,然後在末尾添加 的else,並從那裏返回一定的價值。
  • 或者,你可以簡單地在你的方法的末尾添加一個return語句。
+0

謝謝!交換到塊的結尾工作就好了 – hughdavies

0

如果沒有if聲明爲真,則需要return聲明。

3

基本上,編譯器不夠聰明,無法弄清楚你已經用四個if語句(它並不真正瞭解返回值爲Random.nextInt()的合同)涵蓋了所有可能性。

因此,您需要在最後的if後添加一個虛擬return。這並不重要,因爲它實際上是死代碼。但是,返回某種未使用或明顯無效的值是很好的方式。

編輯:關於第二個想法,不是返回一個虛擬值,而是無條件拋出某種「程序員錯誤」異常。

+0

+1第二個想法。'拋出新的Error();'或更多(毫無意義)精心製作。 –

0

上述/以前的答案解釋說,如果沒有if爲真,則最後需要return聲明。我只想添加一個建議,作爲一種很好的做法(在這種情況下可能不是最佳做法):只在最後返回一個結果,併爲每個if中的返回結果指定一個值(可能會添加一些else s以使其生成在這種情況下效率更高)。