【问题标题】:How to properly an catch exception如何正确捕获异常
【发布时间】:2013-12-03 09:48:09
【问题描述】:

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

    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)

我在这里做错了什么?

【问题讨论】:

    标签: java exception-handling


    【解决方案1】:

    第一个问题是当 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);
      }
    }
    

    【讨论】:

    • 很高兴为您提供帮助。如果这看起来正确,您介意将问题标记为已回答吗?
    • 对不起,我还是新手
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2016-05-21
    • 2020-01-29
    • 2011-12-29
    • 2015-10-09
    相关资源
    最近更新 更多