当我尝试让用户重新输入数字时遇到此错误。
while(guess != num) {
System.out.println("Guess a number between 1 and 10.");
try{
guess = scan.nextInt();
}catch(Exception e) {
System.out.println("Enter a valid number.");
guess = scan.nextInt();
}
}
错误在下次guess = scan.nextInt();中出现
输入/输出:
Guess a number between 1 and 10.
d
Enter a valid number.
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at HiLo.main(HiLo.java:19)
我只是在学习Java,感谢您的帮助。
答案 0 :(得分:0)
因此,您的catch语句在技术上可以处理该异常,但是如果您没有输入数字(try {内的扫描行),它仍会引发原始异常。您必须在catch语句中调用scan.next();
。 Java扫描仪很奇怪。
while(guess != num) {
System.out.println("Guess a number between 1 and 10.");
try{
guess = scan.nextInt();
}catch(Exception e) {
System.out.println("Enter a valid number.");
scan.next();
}
}
应该可以。
答案 1 :(得分:-1)
InputMismatchException
在读取任何不是整数的字符后,由Scanner实例的方法nextInt
引发。还必须考虑Java中整数变量(int
)的最大和最小大小。
这个问题还不清楚,但是从给定的代码和示例用户输入中,我猜测目标是使用户重新输入一个数值,直到输入所需的数字,同时告知用户错误的输入类型。
这是可以实现的方式:
public class NumberGuessing {
public static void main(String[] args) {
int guess = -1;
int num = 9;
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("Guess a number between 1 and 10.");
String enteredValue = scan.next();
while(!validNumber(enteredValue)) {
System.out.println("Enter a valid number.");
enteredValue = scan.next();
}
guess = Integer.parseInt(enteredValue);
if (guess == num) {
System.out.println("That's right! The hidden number was: " + num);
break;
}
}
}
private static boolean validNumber(String s) {
try{
int num = Integer.parseInt(s);
return num >= 1 && num <= 10; //change this to `return true;` if range check is not needed
}catch(NumberFormatException e) {
return false;
}
}
}
它使用Scanner实例的方法next()
的原因是nextInt
仅读取看到的第一个字符串,而不读取换行符。因此,当在内部使用nextInt
循环时,下一次迭代将尝试读取换行符,这也将导致InputMismatchException
。
最好从控制台读取next()
的整行,然后解析它以使输入与用户需求保持一致。
Edit2:如果不需要范围检查,则可以使用正则表达式检查:
while (guess != num) {
System.out.println("Guess a number between 1 and 10.");
String enteredValue = scan.next();
while (!enteredValue.matches("-?\\d+")) {
System.out.println("Enter a valid number.");
enteredValue = scan.next();
}
guess = Integer.parseInt(enteredValue);
}
如果您要避免以“ 0”开头,则可以将数字开头的“ 0”开头,在某些情况下可能不是有效数字,将matches
方法更改为.matches("-?(0|[1-9]\\d*)")
。