如何正确处理catch异常



所以我必须通过扫描仪获取输入。我试图让程序在用户输入非整数值时不断要求用户提供有效的输入。以下是我试图实现这一目标的方式。

    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)

我在这里做错了什么?

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

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

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

第二个问题是,您的代码只允许用户重新输入一次值。如果他们第二次打字错误,你就倒霉了。我建议这样做:

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);
  }
}

最新更新