循环冲突时提示继续

时间:2015-10-15 00:36:56

标签: java while-loop

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

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

这是我的代码

String rerun = null;
boolean run = true;
int x;
int y;

while (run = true)
        {
            // first question
            x = keyboard.nextInt();
            y = keyboard.nextInt();

            // run program with x and y


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

            if (rerun.equalsIgnoreCase("yes"))
            {
                continue;
            }
            else
            {
                run = false;
                //break; stops the loop without answering the second question
            }


        }

示例输入/输出:

输入您希望我绘制的房屋的高度和宽度: 4 4

程序运行......

鲍勃,你想让我为你画另一个房子(是的继续)? 输入您要绘制的房屋的高度和宽度(必须是偶数):

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

谢谢!

3 个答案:

答案 0 :(得分:0)

试试这个。

我没有太多更改你的代码,但是我在屏幕上打印了一个提示,然后要求用户输入并在重新启动循环之前在屏幕上打印用户输入。你也可以尝试并按下面所示捕获块,看看发生异常的位置。如果用户为x或y输入String而不是int,这也会有所帮助。

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);
    }
}

}

答案 1 :(得分:0)

从您的问题看,您似乎希望循环在测试之前至少运行一次。如果是这种情况,那么do while循环可能比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");
}

在我看来,与设置一个标志相比,它仍然是一个更清晰,更不易碎的解决方案。

答案 2 :(得分:0)

问题是在使用nextInt()方法后,'end of line'字符仍在输入缓冲区中。您必须通过调用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();