【问题标题】:Missing a return statement somewhere?在某处缺少退货声明?
【发布时间】:2016-03-04 22:01:24
【问题描述】:

我正在为学校完成一项基本的 Java 作业。这个 sn-p 涉及在 ArrayList 中搜索特定的零件号。当我尝试编译时,IDE 说我缺少返回语句。但是,我看不到它在哪里。索引增加后是否需要返回语句?如果是这样,则返回 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;
        }

    }
}

【问题讨论】:

  • 想象一下items.size() == 0的情况,你的函数会返回什么?
  • 或者当fetchedPartNumber在所有情况下都不等于searchPartNumber,或者fetchedPartNumber为空,或者...建议OP重写一些方法体。
  • searching 变量似乎是多余的。在它设置为false 的唯一情况下,您会立即返回。

标签: java arraylist


【解决方案1】:

您的代码有几个问题:

  1. 在您比较了列表中的第一项但它不匹配后 - 您将停止比较,因为搜索为真,您将返回 null
  2. 如果列表为空,您也需要返回 null

这里是固定版本:

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

【讨论】:

  • 非常感谢。虽然这个赋值需要一个 while 循环,但对于初学者来说,看看它在 for 循环中是如何工作的仍然非常有帮助。欣赏它。
【解决方案2】:

该方法在所有情况下都需要返回值。这意味着您也必须在 else 块中添加一个返回值。或者您可以在所有语句的末尾只添加一次返回值。

【讨论】:

    【解决方案3】:

    您没有处理搜索不成立的情况。

    也就是说,

     if(searching){
                return null;
            }
    

    这里的 else 部分在哪里处理?

    【讨论】:

    • 谢谢,这是我没有真正看到的问题。
    【解决方案4】:

    无论您的方法中发生什么,都必须返回一些值(即使它为空)。

    现在,如果你从来没有进入你的 while (因为条件不满足开始 -> 就像 items.size() 为 0 时),你的方法将不会返回任何东西。

    换句话说:放一个return null;在你的 while 循环的右括号之后。

    另一个重要提示:您确实意识到,这将始终只查看第一项,对吗?因为如果您的第一个项目不是您要搜索的项目,您的变量搜索仍然为真,这将强制该方法返回 null(不查看任何其他项目)

    【讨论】:

    • 感谢您提供清晰明确的答案。我已经删除了搜索布尔值,因为它实际上并不需要在那里,并在循环之后添加了返回。
    【解决方案5】:

    while 循环之后,您在末尾缺少return 语句。

    这是处理 while 循环保护变为 false 的情况所必需的,因为 items 为空,或 searching 设置为 false

    编译器无法确定这些是否永远不会变为假,因此您需要返回以防万一。

    【讨论】:

    • 感谢您的澄清,所有可能的结果现在都已计算在内!
    【解决方案6】:

    所有具有类型(非 void)的函数都要求您根据方法签名返回一些内容。这意味着您必须在所有情况下都返回一些东西。您没有包含搜索不正确的情况,如果是这种情况,则必须返回一些内容。

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

    需要注意的是,在这种情况下 else 是隐含的,因此您实际上不必提供 else。你可以这样做:

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

    请记住,如果搜索为真,它将返回 null 并且永远不会调用“返回其他内容”。

    【讨论】:

    • 感谢您的提示,我很感激。我删除了搜索布尔值,因为它对于此代码的功能并不是真正必需的。
    【解决方案7】:

    这样做

        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
        }
    

    【讨论】:

      【解决方案8】:

      首先,如果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;
      }
      

      【讨论】:

      • 非常感谢您的帮助!我看到不需要搜索布尔值,因为在 while 循环之后返回很好。
      猜你喜欢
      • 2012-10-04
      • 2013-07-11
      • 2016-06-23
      • 1970-01-01
      • 2011-03-30
      • 2020-09-15
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多