2016-03-04 35 views
0

我正在爲學校開展基本的Java任務。該片段涉及在ArrayList中搜索特定的部件號。當我嘗試編譯時,IDE說我有一個缺少的return語句。但是,我看不到它在哪裏。索引增量後是否需要返回語句?如果是這樣,那麼返回null變得無法訪問。非常感謝你們。在某處丟失返回語句?

 public InventoryItem findInventoryItem(int searchPartNumber) 
{ 
    int index = 0; 
    boolean searching = true; 
    while (index < items.size() && searching){ 
     InventoryItem inventoryItem = items.get(index); 
     int fetchedPartNumber = inventoryItem.getPartNumber(); 
     if(fetchedPartNumber == (searchPartNumber)){ 
      searching = false; 
      return inventoryItem; 
     } 
     else{ 
      index++; 
     } 

     if(searching){ 
      return null; 
     } 

    } 
} 
+9

想象一下'items.size()== 0'的情況,函數會返回什麼? –

+0

或者在所有情況下'fetchedPartNumber'不等於'searchPartNumber',或者'fetchedPartNumber'爲null,或者...建議OP重新編寫方法體。 – Dave

+1

「搜索」變量似乎是多餘的。在唯一的情況下,它被設置爲「假」,你會立即返回。 –

回答

1

你的代碼中有幾個問題:

  1. 你相比列表的第一個項目後不匹配 - 你會停止比較,因爲搜索是真實的,你會在空的情況下返回null
  2. 列出你需要返回null太

這裏是固定的版本:

public InventoryItem findInventoryItem(int searchPartNumber) { 
    for (InventoryItem inventoryItem : items) 
     if (inventoryItem.getPartNumber() == searchPartNumber) 
      return inventoryItem; 
    return null; 
} 
+0

非常感謝。雖然這個賦值需要一個while循環,但作爲一個初學者,它仍然非常有用,看看它在for循環中是如何工作的。欣賞它。 – Cazish

0

你不處理搜索不成立的情況。

也就是說,

if(searching){ 
      return null; 
     } 

哪裏還有一部分在這裏處理?

+0

謝謝,這是我沒有真正看到的問題。 – Cazish

1

該方法預計在所有情況下返回值。這意味着你必須在else塊中添加一個返回值。或者您可以在所有語句結束時僅添加一次返回值。

0

不管你的方法發生什麼,都必須返回一些值(即使它爲空)。現在,如果你從來沒有進入過你的時間(因爲這個條件沒有滿足開始 - >就像items.size()爲0時),你的方法不會返回任何東西。

換句話說:把一個返回null;在while循環的右括號之後。

另一個重要的注意事項:你意識到這一點總是隻看第一項,對吧?因爲如果你的第一個項目不是你正在搜索的項目,你的變量搜索仍然是真實的,這將強制方法返回null(不看任何其他項目)

+0

非常感謝您的回答。我已經刪除了搜索布爾值,因爲它並不需要在那裏,並且在循環之後添加了返回值。 – Cazish

0

首先你需要返回if items.size等於零。第二,如果你什麼都找不到,你需要回來。第三,我看不到變量searching的任何用處。 您可以稍微改變您的搜索功能。最終的形式是這樣的:

public InventoryItem findInventoryItem(int searchPartNumber) { 
    int index = 0; 
    while (index < items.size()){ 
     InventoryItem inventoryItem = items.get(index); 
     int fetchedPartNumber = inventoryItem.getPartNumber(); 

     if(fetchedPartNumber == searchPartNumber) 
      return inventoryItem; 

     else 
      index++; 
    } 
    return null; 
} 
+0

非常感謝您的幫助!我看到如何不需要搜索布爾值,因爲返回符合while循環很好。 – Cazish

0

你就在年底缺少return聲明中,while循環之後。

這需要處理,其中while環路保護變爲假的情況下,無論是由items是空的,或searching設定爲false

編譯器無法確定它們是否永遠不會成爲錯誤,因此,如果它們這樣做,它需要您返回。

+0

感謝您的澄清,所有可能的結果現在佔了! – Cazish

0

這樣做

public InventoryItem findInventoryItem(int searchPartNumber) 
    { 
     int index = 0; 
     //boolean searching = true; comment out this line 
     InventoryItem inventoryItem = null; //declare null InventoryItem here 
     while (index < items.size()) 
     { 
      inventoryItem = items.get(index); 
      int fetchedPartNumber = inventoryItem.getPartNumber(); 
      if (fetchedPartNumber == (searchPartNumber)) 
      { 
       //searching = false; comment out this line 
       break; //do something to get out from while loop 
      } 
      else { 
       inventoryItem = null; 
       index++; 
      } 
     } 

     return inventoryItem; //if found then it will have item otherwise null 
    } 
0

所有具有類型(不是void)的函數都要求您根據方法簽名返回某些內容。這意味着你必須在所有情況下返回一些東西。您沒有包括搜索不真實的情況,並且如果情況確實如此,則必須返回。

 if(searching){ 
      return null; 
     } else{ 
      //return something else 
     } 

重要的是要注意,雖然在這種情況下else是隱式的,因此您實際上不必提供else。你可以,而不是僅僅做到這一點:

 if(searching){ 
      return null; 
     } 
     //return something else 

記住,如果搜索是真實的,它會返回null和「返回別的東西」永遠不會被調用。

+0

謝謝你的提示,我很感激。我刪除了搜索布爾值,因爲它對於這段代碼的功能來說並不重要。 – Cazish