【问题标题】:Do-while statement JavaDo-while 语句 Java
【发布时间】:2016-01-10 12:19:10
【问题描述】:

我是编程新手。我很难理解这段代码:

public static boolean onCampus(String name)
{
    boolean invalidResponse = true;
    do{
    System.out.println("Is "+name+ " living on campus? (yes/no)");
    String response = in.nextLine();
    if(response.equalsIgnoreCase("yes"))
        return true;
    else if (response.equalsIgnoreCase("no"))
        return false;
    else
        System.out.println("Invalid response.");
    } while(invalidResponse);
    return false;
}

如果用户输入可接受的响应,我不知道invalidResponse 在哪里分配false?最后一个return false; 是什么?为什么在do-while语句之后?

【问题讨论】:

  • 最后一个return false; 是无法访问的代码。编译器不知道 invalidResponse 永远不会更新,但如果您将其更改为 do { ... } while (true); 您会从最后一个 return 语句中得到一个编译错误。

标签: java loops return do-while


【解决方案1】:

假设in 代表一个静态的Scanner 变量。

循环是故意无限的; invalidResponse 永远不会被设置为 false

相反,return 行是退出循环的方法,假设输入了 "yes""no" 的值。

最终的return false; 是编译所必需的,但永远不会到达。

然而,值得注意的是,我是单个 return 的粉丝,它使用常量作为等号的前半部分,并删除了一次区分大小写,并将其重新编码为:

public static boolean onCampus(String name) {

    boolean response = false;

    do {

        System.out.println("Is " + name + " living on campus? (yes/no)");
        String input = in.nextLine().toLowerCase();
        response = "yes".equals(input);

        if (response || "no".equals(input)) {

            break;  // exit the loop

        } else {

            System.out.println("Invalid response.");
        }

    } while (!response);

    return response;
}

【讨论】:

    【解决方案2】:

    最后一个“return false;”就在那里,这样编译器就不会抱怨,它是无法访问的代码。因为您的返回类型是布尔值,所以您的代码在所有情况下都必须返回 true 或 false。 "invalidResponse" 永远不会分配给 false,因此您的循环将无限运行,直到用户输入是或否,在这种情况下它返回布尔值并退出函数。

    【讨论】:

      【解决方案3】:

      这在某种程度上是一种反模式 - 循环是无限的,并且永远不会“正确”终止。相反,一旦获得有效响应,您只需调用 return 并退出该方法,从而终止循环。

      循环后的return false 是一个编译限制。在 java 中,如果方法返回一个值,那么每个可能的分支都必须包含一个 return 语句(或者准确地说是一个 throw 语句)。在编译时,Java 并不“知道”循环可能永远不会终止,因此它会强制您在该分支中有一个 return 语句(即,假设循环在没有执行 ifelse if 分支的情况下终止)。

      【讨论】:

      • 谢谢。这是编写此方法的最佳方式还是使用其他循环语句更合适?
      • @MarcoGreselin 这是一个很常见的成语。我会内联 invalidResponse 变量,但这比什么都重要。
      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 2020-05-07
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多