尝试捕获块中的线程“主”中的异常

时间:2019-10-10 22:42:26

标签: 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.");
        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,感谢您的帮助。

2 个答案:

答案 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*)")