3

我想从循环中返回一个值。我的代码如下:

public long findLocationId(String location) throws SystemException
    {

        long locId = 1;

        List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);

            for(Location findLoc : locationList)  {
                if(location == findLoc.getLocationName())  {
                    locId = findLoc.getLocationId();

                    **return locId;**
                }
            }

    }

当我尝试将返回值放入循环中时,我收到一条错误消息,指出要包含 return 语句。

我应该如何更改我的代码,以便我可以从循环本身返回一个值?

我想返回我在循环中获得的新 locId 值,而不是我最初设置为 locId = 1 的值;我想返回从循环中获得的 locId 的新值

4

14 回答 14

4

有多种方法可以解决这个问题。

  1. 使用 while 循环
  2. 使用带有附加停止条件的 for 循环
  3. 使用break关键字。

在介绍我们的逻辑之前先创建一个模板:

public long findLocationId(String locationName) throws SystemException
    {

        if(locationName == null) { //Here we cover first issue. 
            throw new IllegalArgumentException("THe locationName must not be null");
        }

        long locId = Long.MIN_VALUE; //We declare a default value that will be returned if none match found. 

        Collection<Location> locationList = getLocationList(); //The location can be read from another method so we are not binded to field.

        if(locationList == null || locationList.isEmpty()) {
            return locId; // Or throw an exception about invalid state.
        }


        //Place for the logic


        return locId;

    }

通常,当我们不知道何时要停止迭代时,这表明我们应该从 while 循环开始。

所以让我们试试吧。

解决方案 1 - while 方式。

 Iterator<Location> iterator = locationList.iterator();

        while(iterator.hasNext() && Long.MIN_VALUE != locId) {

            Location location = iterator.next();

            if(locationName.equalsIgnoreCase(location.getLocationName())) {
                locId = location.getLocationId(); // This will change the locId, so second condition will be no longer true and loop will end.
            }

        }

优点: - 它有效

缺点: - 离开迭代器

我们不应该留下迭代器,因为这很容易出错。这导致我们下一个解决方案。

解决方案 2 - 我们使用迭代器的模式而不是 while。

 for(Iterator<Location> iterator2 = locationList.iterator();iterator.hasNext() && Long.MIN_VALUE != locId;) {

            Location location = iterator.next();

            if(locationName.equalsIgnoreCase(location.getLocationName())) {
                locId = location.getLocationId(); // This will change the locId, so second condition will be no longer true and loop will end.
            }
        }

优点 - 它有效

缺点 - 它很复杂,我们必须在阅读此代码时停止。

由于上述解决方案不易阅读,因此也应删除。

解决方案 3 - 为什么 break 有用。

for(Location location : locationList) {

            if(locationName.equalsIgnoreCase(location.getLocationName())) {
                locId = location.getLocationId();
                break;
            }

        }

优点 - 有效 - 可读

缺点 - 无

结论是代码应该是可读的。使用break,我们指出我们找到了匹配并且我们不想再继续前进。

美好的。但是案件什么时候location被发现呢?

我们返回的 OP 示例1L。这不是最佳选择,因为该值很可能用作 ID。

在前面的示例中,我使用了 long 的最小值。这在某些情况下是可以接受的,但我们仍然需要验证方法结果,并记录它。

最终的解决方案是额外的循环出口,即return关键字。

public long findLocationId(String locationName) throws SystemException
    {

        if(locationName == null) { //Here we cover fist issue. 
            throw new IllegalArgumentException("THe locationName must not be null");
        }

        Collection<Location> locationList = getLocationList(); //The location can be read from another method so we are not binded to field.

        if(locationList == null) {
            throw new IllegalStateException("THe location list was not initialized"); 
        }

        for(Location location : locationList) {

            if(locationName.equalsIgnoreCase(location.getLocationName())) {
                return location.getLocationId(); //We exit from the method.
            }

        }

        throw new SystemException("Could not found location for name:" + locationName); 

    }

附加说明

在示例 OP havelocation == findLoc.getLocationName()中,此代码的问题是我们不应该使用==来比较对象类型(详细信息)。当我们处理 String 类时推荐的方法是使用方法String#equals(Object)或 'String#equalsIgnoreCase(String)'。对于这个例子,我使用了第二个选项。

于 2013-04-05T08:21:43.773 回答
3

这是因为函数中的所有控制流都应该以返回一个 long 值结束。

在您的情况下,假设列表中没有匹配项,因此 return 语句将永远不会被执行,这就是报告错误的原因。

要解决此问题,您可以在函数末尾添加一个带有默认值的 return 语句,或者如果您的逻辑允许,您可以抛出一个表示找不到位置的 execption。

解决方案1:如果1没有匹配则要返回

public long findLocationId(String location) throws SystemException {
    long locId = 1;
    List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,
            -1);
    for (Location findLoc : locationList) {
        if (location == findLoc.getLocationName()) {
            locId = findLoc.getLocationId();
            break;
        }
    }
    return locId;
}

解决方案2:如果找不到位置则抛出异常

public long findLocationId(String location) throws SystemException {
    List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,
            -1);
    for (Location findLoc : locationList) {
        if (location == findLoc.getLocationName()) {
            return findLoc.getLocationId();
        }
    }
    throw new SystemException("Unable to find the location");
}
于 2013-04-05T07:32:03.687 回答
3

这是因为并不总是会出现location == findLoc.getLocationName(). 即使是这种情况,java 编译器也不知道你给程序提供了什么样的输入,所以它会告诉你,即使函数必须返回很长的值,它也可能不返回任何内容。

只需在函数末尾返回 -1L 或您的程序可以认为“未找到”的东西。

于 2013-04-05T07:33:32.553 回答
1

必须有一个默认的 return 语句。由于只有返回语句也是有条件的,编译器将强制您使用默认语句。

public long findLocationId(String location) throws SystemException{

    long locId = 1;
    List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);
    for(Location findLoc : locationList)  {
         if(location == findLoc.getLocationName())  {
             locId = findLoc.getLocationId();
                return locId;
         }
    }
    return locId; // default return value
}
于 2013-04-05T07:31:50.247 回答
1
public long findLocationId(String location) throws SystemException
    {

        long locId = 1;

        List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);

            for(Location findLoc : locationList)  {
                if(location == findLoc.getLocationName())  {
                    locId = findLoc.getLocationId();


                }
            }
          return locId;
    }

试试这个你会得到答案

于 2013-04-05T07:37:23.517 回答
0
public long findLocationId(String location) throws SystemException
    {

        long locId = 1;

        List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);

            for(Location findLoc : locationList)  {
                if(location == findLoc.getLocationName())  {
                    locId = findLoc.getLocationId();
                    break;
                }
            }
            return locId;
    }
于 2013-04-05T07:31:57.770 回答
0

那是因为你的return陈述在你的if陈述中,这是有条件的。因此,如果存在控件从未进入if块的情况,则该方法将没有return值。

return因此,在方法的末尾有一个默认值。

于 2013-04-05T07:32:08.907 回答
0

如果您的if声明没有找到任何与您的位置相同的位置,则意味着将会发生什么。这就是发生此编译错误的原因。因此,您必须在方法的末尾添加一个 return 语句。

public long findLocationId(String location) throws SystemException
{

    long locId = 1;

    List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);

        for(Location findLoc : locationList)  {
            if(location == findLoc.getLocationName())  {
                locId = findLoc.getLocationId();

                **return locId;**
            }
        }
return
}
于 2013-04-05T07:32:25.977 回答
0

如果您不使用更多执行循环,则应使用break语句从循环中出来。

您不能在 for 循环中使用 return 语句,因为此 return 语句将调用多次。

并且该方法一次只需要一个返回语句。
这里break的语句将跳出最里面的循环(这里是 for 循环)。

public long findLocationId(String location) throws SystemException
    {

        long locId = 1;

        List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);

            for(Location findLoc : locationList)  {
                if(location == findLoc.getLocationName())  {
                    locId = findLoc.getLocationId();
                   break;
                }
            }
     return locId;
    }

更多详情:
请访问这里

于 2013-04-05T07:32:30.097 回答
0

您的 return 语句位于“if”语句中,这意味着如果“if”评估为 false,则不会到达。您需要在“if”语句之外的 return 语句。

于 2013-04-05T07:32:44.830 回答
0

问题是:如果不满足循环中的条件,您的方法会返回什么?

需要返回一个默认值,return语句需要放在for循环之后。

于 2013-04-05T07:34:04.247 回答
0

您的代码中有 2 个问题。

  1. 一个方法必须有一个return,但是在for循环中,因为它也是一个条件流(它甚至可能不会运行一次),你必须提供一个替代的 return 语句。尽管它会返回先出现的东西。
  2. 每个流程中都必须有一个return。但由于您的退货状况良好,因此如果为假if,则会缺少一条return声明。if-expression然后,您需要在外部提供替代的 return 声明if。(否则编译器会显示错误)

在您的代码中: for(Location findLoc : locationList) { if(location == findLoc.getLocationName()) { locId = findLoc.getLocationId(); 返回位置标识;} } 返回 locId; // 添加这个可以解决问题

于 2013-04-05T07:36:09.910 回答
0

如果找不到元素,您只需添加一个 return 语句。简单的独立示例:

public class Main {

    public static long findStringIDX(String[] myList, String myString) {

        long locId = 0;

        for (String s : myList) {
            if (myString.equalsIgnoreCase(s)) {
                return locId;
            }
            locId++;
        }
        return -1; // Not found

    }

    public static void main(String[] args) {
        String[] myList = new String[] { "hello", "world", "bobby" };
        System.out.println(findStringIDX(myList, "bobby"));
    }

}
于 2013-04-05T07:38:41.093 回答
0

简单的方法来做到这一点。

public long findLocationId(String location) throws SystemException
{
  long locId = 1; // but i suggest to put -1
  List<Location> locationList = LocationLocalServiceUtil.getLocations(-1,-1);
  for(Location findLoc : locationList)  {
    if(location == findLoc.getLocationName())  {
      return findLoc.getLocationId();
    }
  }
  return locId;
}
于 2013-04-05T07:38:52.333 回答