为什么我的do-while循环在使用Java扫描器输入无效输入后变成无限循环?
当你输入数字以外的任何东西时,它将永远打印我的“无效响应”。但是,当你输入一个数字时,它将转到下一个(正常工作) 我不明白为什么它在检查失败时不断打印我的错误消息。相反,我希望它再次请求用户输入 如果你知道一个更好更有效的方法,请帮助我为什么我的do-while循环在使用Java扫描器输入无效输入后变成无限循环?,java,do-while,Java,Do While,当你输入数字以外的任何东西时,它将永远打印我的“无效响应”。但是,当你输入一个数字时,它将转到下一个(正常工作) 我不明白为什么它在检查失败时不断打印我的错误消息。相反,我希望它再次请求用户输入 如果你知道一个更好更有效的方法,请帮助我 public class Test { public static void main(String[] args) { //Scanner getting input Scanner nin = new Scanner
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 largest\n");
System.out.println("\n\n");
//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.\n\n");
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.\n\n");
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.\n\n");
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;
}
}
}
您的代码从未实际读取错误输入,因为它使用
nextInt
读取有效输入。(hasNext
只是告诉您是否有要读取的输入。)首先,您不需要2个Scanner
对象,因为您是从同一位置读取的
记住-无论你需要阅读什么,每个文件一个扫描仪就足够了
但真正的问题是您没有清除无效的用户输入。
方法hasNext
只检查是否有更多的输入准备好处理,但不做任何处理
如果发现仍有输入,但它不是整数(hasNext
返回true
但hasNextInt
返回false
),则应调用方法,以获取剩余的输入,而不考虑类型(忽略返回值)
另外,由于您需要3个相同的循环,因此最好只将一个循环放在一个单独的私有方法中,该方法将返回值,然后调用该方法3次
privat int getNumberFromUser() {
do {
//your loop code here
} while (!valid);
return num;
}
//in main:
num1 = getNumberFromUser();
num2 = getNumberFromUser();
num3 = getNumberFromUser();
你认为nin.hasNext()
能完成什么?它不应该在错误发生后等待用户输入吗?欢迎使用堆栈溢出。搜索现有Q/a总是值得的,而且有很多Q/a与java.util.scanner
的正确/错误使用有关。例如,检查这个答案。另外,在使用Java API(如扫描仪)时,检查。还可以看看;)非常感谢你!这真的帮了我的忙,我的java老师用“就是这样”的方式解释了这件事,所以谢谢你用外行的术语解释。谢谢你对扫描仪的澄清,我一直不明白她为什么坚持要两台。。。。。