看起来相当简单让我完全糊涂了。我要求用户在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
程序运行......
鲍勃,你想让我为你画另一个房子(是的继续)? 输入您要绘制的房屋的高度和宽度(必须是偶数):为什么它会再次询问我的高度和宽度,即使我最后有条件,禁止循环重启,然后再提示它继续?
谢谢!
答案 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();