Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环冲突时提示继续_Java_While Loop - Fatal编程技术网

Java 循环冲突时提示继续

Java 循环冲突时提示继续,java,while-loop,Java,While Loop,看起来相当简单的事情把我完全弄糊涂了。我要求用户在while循环开始时提供一些输入,以便能够在循环内执行程序。程序执行后,我想在循环结束时提示用户重新启动或结束循环 我试图让循环在完成程序后只问最后一个问题。然后,如果用户回答是,循环将重新启动。任何其他答案都将导致循环结束 这是我的密码 输入/输出示例: 输入要我绘制的房屋的高度和宽度:4 程序运行 鲍勃,你想让我再给你画一栋房子吗?是的,继续吗? 输入要我绘制的房屋的高度和宽度必须为偶数: 为什么它会再次询问高度和宽度,即使我在最后有条件,在

看起来相当简单的事情把我完全弄糊涂了。我要求用户在while循环开始时提供一些输入,以便能够在循环内执行程序。程序执行后,我想在循环结束时提示用户重新启动或结束循环

我试图让循环在完成程序后只问最后一个问题。然后,如果用户回答是,循环将重新启动。任何其他答案都将导致循环结束

这是我的密码

输入/输出示例:

输入要我绘制的房屋的高度和宽度:4

程序运行

鲍勃,你想让我再给你画一栋房子吗?是的,继续吗? 输入要我绘制的房屋的高度和宽度必须为偶数:

为什么它会再次询问高度和宽度,即使我在最后有条件,在我提示循环继续之前禁止循环重新启动

谢谢大家!

试试这个

我没有对您的代码做太多更改,但是我在请求用户输入之前在屏幕上打印了一个提示,并在重新启动循环之前在屏幕上打印了用户输入。您还可以执行下面的try-and-catch块,查看异常发生的位置。如果用户输入字符串而不是int表示x或y,这也会有帮助

import java.util.Scanner;

public class Test {

public static void main(String args[]) {

    String rerun = null;
    boolean run = true;
    Scanner keyboard = new Scanner(System.in);

    while (run == true) {

        int x = 0;
        int y = 0;
        String val = "";

        System.out.print("Enter x int : ");
        try {
            x = keyboard.nextInt();
        }
        catch (Exception ex) {

            System.out.println("Error at x : " + ex.getMessage());
        }
        System.out.print("Enter x int : ");
        try {
            y = keyboard.nextInt();
        }
        catch (Exception ex) {

            System.out.println("Error at y : " + ex.getMessage());
        }
        System.out.print("Enter string : ");
        try {
            val = keyboard.nextLine();
        }
        catch (Exception ex) {

            System.out.println("Error at string: " + ex.getMessage());
        }
        System.out.println("x : " + x + ", y : " + y + ", val : " + val);
    }
}

}

从您的问题来看,似乎您希望循环在测试之前至少运行一次。如果是这种情况,那么DoWhile循环可能比while循环更合适

do-while循环类似于:

do {
     int x = keyboard.getInt();
     int y = keyboard.getInt();
     // process
     System.out.println("Do you want to continue?");
} while (keyboard.nextLine().equalsIgnoreCase("yes"));
在我看来,这似乎比原始代码的while循环更好地捕获了您的意图,并且避免了我发现难以理解的keepRunning布尔值

如果您发现while语句令人困惑,而不是返回到布尔变量,则可以将测试拆分为单独的方法:

do {
    ...
} while (shouldRepeat());

private boolean shouldRepeat() {
    System.out.println("Do you wish to continue?");
    String answer = keyboard.nextLine();
    return answer.equalsIgnoreCase("yes");
}

在我看来,与设置标志相比,这仍然是一个更清晰、更不脆弱的解决方案。

问题是,在使用nextInt方法后,“行尾”字符仍在输入缓冲区中。必须通过调用nextLine手动刷新缓冲区。我已经修改了下面的代码,以显示如何修复此问题

        // first question
        x = keyboard.nextInt();
        y = keyboard.nextInt();

        // run program with x and y

       //Flush Input Buffer
       keyboard.nextLine();

        // second question (ask to continue)
        rerun = keyboard.nextLine();

别忘了在y=keyboard.nextLine;之后调用keyboard.nextLine;。这将吞掉nextInt无法完成的行尾字符。我不介意我需要在同一行上输入整数。我试图让循环只问我最后一个问题。请尝试并找出答案。这不是我想要做的。我希望只有在循环中的程序被执行之后,才会提示用户回答最后一个问题。然后,根据他们的回答,决定重新启动或结束循环。问题澄清程序在循环开始时和循环结束时输出两个问题,这是因为你在循环中同时问这两个问题。如果你不想重复问第一个问题,把它移出循环。抱歉,我在上面加了一个解释。这对我来说现在太复杂了。我将首先尝试一个switch语句,它基本上是您的代码。唯一主要的变化是try-and-catch块。它们捕获代码抛出的错误,而不会使应用程序崩溃。看一看
        // first question
        x = keyboard.nextInt();
        y = keyboard.nextInt();

        // run program with x and y

       //Flush Input Buffer
       keyboard.nextLine();

        // second question (ask to continue)
        rerun = keyboard.nextLine();