2013-11-22 84 views
2

任何人都可以看到爲什麼我會收到錯誤「此方法必須返回類型卡的結果」,當我明確返回該類型卡的變量「卡」?爲什麼我收到錯誤「此方法必須返回類型...的結果?」?

public Card playCard(int id){ 
    int i = 0; 
    for (Card element : hand){ 
     if (i <= hand.size()) 
     {   
      if (element.getID() == id) 
      { 
       Card card = hand.get(i); 
       hand.remove(i); 
       return card; 
      } 
      else 
      { 
       i++; 
      } 

     } 
     else 
     { 
      throw new NullPointerException("Card does not exist in  hand"); 
     } 
    } 
} 
+5

提示:您需要從所有可能的執行流程中「返回」。 –

+2

不要自己拋出'NullPointerException'。 – arshajii

+0

@arshajii在檢查之後顯式拋出'NullPointerException',而不是可能執行一些昂貴的處理,然後訪問一個'null',肯定沒問題。顯式或隱式異常應該是相同的(而不是'InvalidArgumentException'或其他),調用者不需要關心實現細節。當然這與這個問題無關,只是評論你的「永不」。 – hyde

回答

5

您的方法不會返回任何東西,除非在一種可能的情況下。它必須返回全部可能出現的情況(或拋出異常)。

認爲你的意思是這樣:

public Card playCard(int id){ 

    for (Card element : hand) { 
     if (element.getID() == id) { 
      return element; 
     } 
    } 
    throw new SomeAppropriateException("Card does not exist in  hand"); 
} 

...但我猜了一下(因爲我不知道什麼是hand,但它看起來很像一個List )。該代碼將始終執行return語句或拋出異常,如果沒有其中一種情況發生,無法結束該方法。

注意,對於未通過null指針引起的一個條件投擲NullPointerException是一個壞主意(TM)。 (這也是最好是一致在你把你的{}

+2

應該指出,它可以拋出一個錯誤(如他/她的NPE)來代替返回一個值。 –

+0

@ ns47731:好點。 –

1

截至由Tarlen暗示,您的代碼將需要進行修改,例如:

public Card playCard(int id){ 
    int i = 0; 
    for (Card element : hand){ 
     if (i <= hand.size()) 
     {   
      if (element.getID() == id) 
      { 
       Card card = hand.get(i); 
       hand.remove(i); 
       return card; 
      } 
      else 
      { 
       i++; 
      } 

     } 
     else 
     { 
      throw new NullPointerException("Card does not exist in  hand"); 
     } 
    } 
    return null; 
} 

我相信一定會說明你的程序需要採取的所有可能的路線。你總是必須跟蹤返回東西無處不在的方法可以退出。如果它可以在沒有返回聲明的情況下退出,您將看到該錯誤。

1

你的方法簽名是:

public Card playCard(int id){ 

這意味着你必須返回一個Card對象。你的代碼只有一個return語句,但是代碼中有很多路徑。您必須返回每個路徑的Card對象

0

這是因爲如果hand爲空,則不會返回任何值。

在您的for循環後面添加returnthrow

0

對於代碼中的每個可能的執行路徑,您需要爲整個方法或至少一個return語句(或異常/錯誤)使用默認的return語句(或異常/錯誤)。因爲它現在是你們兩個都沒有的。

相關問題