为什么我的 do-while 循环在使用 Java 扫描程序输入无效输入后变成无限循环?



当你输入数字以外的任何内容时,它只会永远打印我的"无效响应:"。但是当您输入一个数字时,它将继续下一个数字(正常工作(。

我不明白为什么它在检查失败时不断打印我的错误消息。相反,我希望它再次要求用户输入。

如果您知道更好更有效的方法,请帮助我。

public class Test {
public static void main(String[] args) {
//Scanner getting input
Scanner nin = new Scanner(System.in); //input for numbers
Scanner sin = new Scanner(System.in); //input for yes or no
//initialize variables
String input = "";
boolean valid = false;
boolean playAgain = false;
//Primary Do While
do {
System.out.println("This program will ask for three numbers and see which one is the largestn");
System.out.println("nn");
//define the range
int num1 = 0;
int num2 = 0;
int num3 = 0;
int largestNum = 0;
//numeric input validation who while loop for the first number
do {
System.out.println("Please enter the frist number: ");
//if block to check if input is valid
if (nin.hasNextInt()) {
num1 = nin.nextInt();
valid = true;
} else {
System.out.println("Invalid response: Please enter a whole number.nn");
valid = false;
nin.hasNext();
}

} while (!valid); //if false run the loop
valid = false; //this resets the validity for the next number
//numeric input validation who while loop for the second number
do {
System.out.println("Please enter the second number: ");
//if block to check if input is valid
if (nin.hasNextInt()) {
num2 = nin.nextInt();
valid = true;
} else {
System.out.println("Invalid response: Please enter a whole number.nn");
valid = false;
nin.hasNext();
}
} while (!valid); //if false run the loop
valid = false; //this resets the validity for the next number
//numeric input validation who while loop for the third number
do {
System.out.println("Please enter the second number: ");
//if block to check if input is valid
if (nin.hasNextInt()) {
num3 = nin.nextInt();
valid = true;
} else {
System.out.println("Invalid response: Please enter a whole number.nn");
valid = false;
nin.hasNext();
}
} while (!valid); //if false run the loop

//passing numbers to method and saving results to variable 
largestNum = largestNum(num1, num2, num3);
//printing the results
System.out.println(largestNum);

} while (!playAgain);

}
private static int largestNum(int num1, int num2, int num3) {
if (num1 > num2 && num1 > 3) {
return num1;
} else if (num2 > num1 && num2 > num3) {
return num2;
} else {
return num3;
}
}
}

首先,您不需要 2 个Scanner对象,因为您是从同一个地方读取的。

请记住 - 无论您需要阅读什么,每个文件一个Scanner就足够了!

但真正的问题是你没有清除无效的用户输入。 该方法hasNext仅检查是否有更多输入可供处理,但不对其进行任何操作。

如果你发现仍然有输入,但它不是整数(hasNext返回truehasNextInt返回false(,你应该调用next方法,以获取剩余的输入,而不考虑类型(忽略返回值(。

此外,由于您需要 3 个相同的循环,因此最好只将一个循环放入将返回值的单独私有方法中,然后调用该方法 3 次。

privat int getNumberFromUser() {
do {
//your loop code here
} while (!valid);
return num;
}
//in main:
num1 = getNumberFromUser();
num2 = getNumberFromUser();
num3 = getNumberFromUser();

您的代码实际上永远不会读取错误的输入,因为它使用nextInt读取有效输入。 (hasNext只是告诉是否有要读取的输入。

最新更新