Java 循环冲突时提示继续
看起来相当简单的事情把我完全弄糊涂了。我要求用户在while循环开始时提供一些输入,以便能够在循环内执行程序。程序执行后,我想在循环结束时提示用户重新启动或结束循环 我试图让循环在完成程序后只问最后一个问题。然后,如果用户回答是,循环将重新启动。任何其他答案都将导致循环结束 这是我的密码 输入/输出示例: 输入要我绘制的房屋的高度和宽度:4 程序运行 鲍勃,你想让我再给你画一栋房子吗?是的,继续吗? 输入要我绘制的房屋的高度和宽度必须为偶数: 为什么它会再次询问高度和宽度,即使我在最后有条件,在我提示循环继续之前禁止循环重新启动 谢谢大家! 试试这个 我没有对您的代码做太多更改,但是我在请求用户输入之前在屏幕上打印了一个提示,并在重新启动循环之前在屏幕上打印了用户输入。您还可以执行下面的try-and-catch块,查看异常发生的位置。如果用户输入字符串而不是int表示x或y,这也会有帮助Java 循环冲突时提示继续,java,while-loop,Java,While Loop,看起来相当简单的事情把我完全弄糊涂了。我要求用户在while循环开始时提供一些输入,以便能够在循环内执行程序。程序执行后,我想在循环结束时提示用户重新启动或结束循环 我试图让循环在完成程序后只问最后一个问题。然后,如果用户回答是,循环将重新启动。任何其他答案都将导致循环结束 这是我的密码 输入/输出示例: 输入要我绘制的房屋的高度和宽度:4 程序运行 鲍勃,你想让我再给你画一栋房子吗?是的,继续吗? 输入要我绘制的房屋的高度和宽度必须为偶数: 为什么它会再次询问高度和宽度,即使我在最后有条件,在
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();