【问题标题】:Why doesn't scanner ask for an other input in a try-catch while loop javajava - 为什么扫描仪不在try-catch while循环java中要求其他输入
【发布时间】:2015-08-31 06:20:56
【问题描述】:

假设我需要不断询问用户,直到他输入double

我所做的是我使用了一个while循环并检查是否有异常。

如果有异常,我会去询问下一个输入。

double bal = 0;
Scanner sc = new Scanner(System.in);
while (true) {
    try {
        System.out.println("Enter the balance");
        bal = sc.nextDouble();
        break;
        } catch (Exception e) {
          System.out.println("That isn't a number");
    }
}
System.out.println("Bal is " + bal);
sc.close();

但是如果我输入一个非双精度,那么它不会要求下一个输入,继续打印以无限循环结尾的那两条线。

Enter the balance
XYZ
That isn't a number
Enter the balance
That isn't a number
Enter the balance
That isn't a number
Enter the balance
That isn't a number
....

我错过了什么?

【问题讨论】:

  • stackoverflow.com/questions/23676834/…(和其他)的可能重复
  • 另外,捕获异常可能不是处理控制流的最佳方式。您可以(并且可能应该)改用 hasNextDouble
  • @yshavit 我也使用了hasNextDouble(),它也以无限循环结束。不知道要丢弃该输入。所以我想问为什么会这样。这只是描述情况的一个说明性示例。

标签: java exception-handling double java.util.scanner


【解决方案1】:

您需要通过在 catch 块中调用 sc.next() 来丢弃流中的先前输入。遗憾的是,当输入失败时,扫描仪不会自动执行此操作。

【讨论】:

  • 哦..我刚刚遇到这个问题,以前从未遇到过。您能否在这里详细说明一些更深入的细节?所以,如果我有 a=scanner.nextInt();在 try 块中,我故意希望发生异常(而且它一直在发生),为什么 a=scanner.nextInt();不要求新的输入?
【解决方案2】:

使用sc.next() 丢弃错误输入:

while (true) {
    try {
        System.out.println("Enter the balance");
        bal = sc.nextDouble();
        break;
    } catch (InputMismatchException e) {
        System.out.println("That isn't a number");
        sc.next();
    }
}

我还建议捕获特定异常(在这种情况下为InputMismatchException)。这样,如果出现其他问题(例如,标准输入流已关闭),您就不会错误地打印"That isn't a number"

【讨论】:

    【解决方案3】:

    来自nextDouble 文档:

    如果翻译成功,扫描仪会超过匹配的输入。

    因此,当输入不匹配时,扫描仪不会越过它。因此,当您执行 nextDouble 的下一次迭代时,输入尚未被清除,它仍会读取相同的输入。

    您应该在失败时通过读取next() 来推进输入,或者将输入读取为字符串并尝试解析结果,这样即使值是非法的,输入也已被清除,下一次迭代您可以读取一个新的值/输入:

    public static void main(String[] args) {
        double bal = 0;
        Scanner sc = new Scanner(System.in);
        while (true) {
            try {
                System.out.println("Enter the balance");
                bal = Double.parseDouble(sc.next());
                break;
                } catch (Exception e) {
                  System.out.println("That isn't a number");
            }
        }
        System.out.println("Bal is " + bal);
        sc.close();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多