2016-03-04 60 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