如何正确捕获异常

时间:2013-12-03 01:22:05

标签: java exception-handling

所以我必须通过扫描仪接收输入。我正在尝试让程序在输入非整数值时继续询问用户输入有效值。以下是我试图实现这一目标的方法。

    System.out.println("Enter an integer");
    Scanner input = new Scanner(System.in);
    int level=0;

    try{
        level=input.nextInt();
    }catch(InputMismatchException e){
        System.out.println(e+". Enter a valid entry!");
        level=input.nextInt();
    }

问题是如果用户输入了一个字符,程序不会让用户输入另一个整数。程序停止并在catch块中打印出print语句以及:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Main.main(Main.java:20) (which is level=input.nextInt(); in the catch block)

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

第一个问题是Scanner抛出异常时会发生什么。 Java文档说:

“当扫描程序抛出InputMismatchException时,扫描程序不会传递导致异常的标记,因此可以通过其他方法检索或跳过它”

这就是为什么你对nextInt的第二次调用会抛出另一个异常 - 它试图重新读取相同的令牌。如果你想丢弃它,你可以直接打电话。

第二个问题是您的代码只允许用户重新输入一次值。如果他们第二次输入错误的东西你就不走运了。我建议这样的事情:

int level = 0;
boolean gotLevel = false;

while (!gotLevel) {
  try {
    level = input.nextInt();
    gotLevel = true;
  } catch (InputMismatchException e) {
    System.out.println("Error. " + input.next() + " is not a valid integer:" + e);
  }
}