【问题标题】:Question about exception (try-catch) within a loop关于循环内异常(try-catch)的问题
【发布时间】:2019-11-12 10:20:38
【问题描述】:

我在其他项目中也遇到过几次这个问题。现在我试图理解异常处理,但我仍然不知道它是如何工作的。 我试图用循环编写一个计算器,当我尝试输入一个字符串时,会有 InputMismatchException - 我试图捕捉它,但由于某种原因在 catch 子句之后,java 给了我另一个 InputMismatchException,为什么?

import java.util.InputMismatchException;
import java.util.Scanner;

public class Calculator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int loop = 1;
        while (loop == 1) {

            try {

                System.out.println("First number:");
                int num1 = scanner.nextInt();
                System.out.println("Second number:");
                int num2 = scanner.nextInt();

                System.out.println("Choose operator (1 for +)(2 for -)(3 for *)(4 for /): ");

                int userInput = scanner.nextInt();

                switch (userInput) {
                case 1:
                    System.out.println("Result: " + num1 + " + " + num2 + " = " + (num1 + num2));
                    break;
                case 2:
                    System.out.println("Result: " + num1 + " - " + num2 + " = " + (num1 - num2));
                    break;
                case 3:
                    System.out.println("Result: " + num1 + " * " + num2 + " = " + (num1 * num2));
                    break;
                case 4:
                    System.out.println("Result: " + num1 + " / " + num2 + " = " + (num1 / num2));
                    break;
                default:
                    System.out.println("Invalid Input!");

                }

                System.out.println("Repeat? (1 = yes)(0 = nein)");

                loop = scanner.nextInt();

            } catch (InputMismatchException e) {
                System.out.println("Invalid Input, try again!");
                scanner.nextInt();

            }

        }
        scanner.close();
        System.out.println("Ciao!");

    }

}

起初有一个无限循环,我在 catch 块中通过scanner.nextInt(); 解决了这个问题,但我仍然收到此错误:

Choose operator (1 for +)(2 for -)(3 for *)(4 for /): 
er
Invalid Input, try again!
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 Calculator.main(Calculator.java:47)

为什么?

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    可能是因为您没有获取 nextInt,因为下一个值不是 int。因此,您尝试在 catch 块中再次获取相同的输入,从而再次出现 InputMismatchException。

    您的 Stacktrace 还指向您尝试检索下一个 int 的 catch 子句!

    我建议你把catch子句中的nextInt替换成nextLine

    ...
    catch (InputMismatchException e) {
        System.out.println("Invalid Input, try again!");
        scanner.nextLine();
    }
    

    然后您将再次开始循环并尝试重新阅读。

    还可以在 stackoverflow 或 tutorialspoint examples for using the Scanner class 上查看 this 类似的线程。

    【讨论】:

    • 你是对的,所以只需通过阅读下一行来阅读并忽略非 int 输入,然后再次开始循环并要求新的输入。我编辑了答案。
    【解决方案2】:

    在您的第一种情况下,它进入无限循环,因为InputMismatchExceptionscanner.nextInt(); 抛出并且您已经处理了该异常,因此它将再次进行下一次迭代,最终再次调用scanner.nextInt(); 但在这种情况下,扫描仪不会移动到新行,因此它将获得 String 而不是它所期望的 int 并抛出 InputMismatchException。您可以通过以下方式解决:

            catch (InputMismatchException e) {
                System.out.println("Invalid Input, try again!");
                scanner.nextLine(); // change nextInt to nextLine
            }
    

    在您当前的代码中,当 InputMismatchException 抛出时,它会转到 catch 块和您的 catch 块,然后再次执行 scanner.nextInt();,这会抛出异常并且您的循环线程终止。

    【讨论】:

    • 哇,谢谢!但是为什么我必须使用scanner.nextLine()
    • nextLine() 越过扫描仪当前行
    【解决方案3】:
    1. 捕获异常后,您应该扫描不匹配的输入。您可以使用scanner.nextLine(),扫描器将扫描错误的输入,以便您的循环重新开始。
    2. 您的程序在异常后重新开始。如果你想在异常之后继续循环,你必须使用多个 try catch 并使用 do while 直到用户输入正确的输入。
    Integer num1 = null;
    do {
       try {
         num1 = scanner.nextInt();
       } catch (InputMismatchException e) {
         System.out.println("Invalid Input, try again!");
         scanner.nextLine();
       }
    } while (num1 == null);
    

    【讨论】:

      【解决方案4】:

      如果我们想捕获异常而不是将其抛出方法之外,那么可能抛出异常的行应该在 try 块中

      try{
      //code which can throw exception T
      }
      catch( exceptions T){
      // what if exception handle it
      } 
      

      但在您的情况下,scanner.nextInt();正在尝试块中产生异常,并且控制再次在此处捕获块,您执行同一行scanner.nextLine(); 再次抛出异常,这次它没有被处理 删除scanner.nextInt();来自 catch 块的行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多