【问题标题】:Java return outside of a for each loopJava在for每个循环之外返回
【发布时间】:2021-08-14 02:35:36
【问题描述】:

简单的虚拟问题...我创建了一个在 for 循环后向我发送对象的方法。 for 循环返回我有问题的对象。但是 Java 要求我在方法的底部发送一个返回值。问题是......我没有任何东西可以在我的方法之外返回。有办法告诉我只返回一个错误吗?

这里有问题的代码......非常简单!

public Stock getStockInfos(String selectedStock) {
    for(Stock temp:registreStock){
        if((temp.getSymbol()).equals(selectedStock)){
            return temp;
        }
    }
}

通常,我需要在最后添加一个 return 语句......我找到的一个解决方案是制作 temp 的副本并在底部返回这个副本。如果这是正确的解决方案,是否有一种简单的方法可以复制/克隆此对象?

【问题讨论】:

  • 你的方法签名承诺返回一个股票。 for 循环和条件不保证匹配。如果没有匹配应该怎么办?解决此问题的一种方法是返回 null 并将处理委托给调用者。
  • 当你的方法声明一个返回类型时,如果你的 if 语句总是返回 false,你需要返回一些东西。如果没有找到,您可以在方法结束时返回一个可选的空。或者只是空。但可选会更安全。
  • 如果没有一只股票与所选股票代码匹配,你的方法应该返回什么?
  • “返回错误”通常意味着“抛出异常”
  • 在 for 循环之外(之前)声明 temp。搜索“java 变量范围”。

标签: java object return return-type


【解决方案1】:

您必须问自己,如果您找不到给定代码的股票,是否会发生这种情况,在这种情况下会发生什么。一种选择是返回 null 或引发异常。

public Stock getStockInfos(String selectedStock) {
    for(Stock temp:registreStock){
        if((temp.getSymbol()).equals(selectedStock)){
            return temp;
        }
    }

    return null;
}

【讨论】:

    【解决方案2】:

    试试这个。您需要所有执行路径的返回值。

       public Stock getStockInfos(String selectedStock) {
       
         for(Stock temp:registreStock){
              if((temp.getSymbol()).equals(selectedStock)){
                return temp;
              }
          }
    
        // This line of code will not be reached assuming return temp is executed - 
        // but will take care of the message
       return null ;
       }
    

    当然,调用此方法的代码必须测试可能返回的 null。

    【讨论】:

    • 是的!那行得通!不明白为什么我不能早点做到……当然是新手错误! :P 再次感谢!
    【解决方案3】:

    我终于做到了,它正在工作

        public Stock getStockInfos(String selectedStock) {
        Stock stockSelected = null;
        for(Stock temp:registreStock){
            if((temp.getSymbol()).equals(selectedStock)){
                stockSelected = temp;
            }
        }
        return stockSelected;
    }
    

    但是...是的...如果找不到对象,我需要修补一下!你是对的!

    谢谢,我再想想!!! :P

    【讨论】:

    • 您应该在找到匹配项后添加break;
    【解决方案4】:

    如果registreStock 是集合,您可以使用stream 和Optional 而不是可为空的值。像这样:

    Optional<Stock> result = registreStock
        .stream()
        .filter((stock) -> stock.getSymbol().equals(selectedStock))
        .findFirst();
    

    返回null 是不好的做法。如果可能,请使用Optional

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2013-12-30
      • 1970-01-01
      • 2012-02-28
      相关资源
      最近更新 更多