当前位置: 首页 > 知识库问答 >
问题:

关于循环内异常(try-catch)的问题

笪智志
2023-03-14

我已经在其他项目中多次遇到这个问题。现在我试图理解异常处理,但我仍然不知道它到底是如何工作的。我试图用循环编程一个计算器,当我试图输入字符串时,会出现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!");

    }

}

起初有一个无限循环,我用扫描器求解。nextInt() 在catch块内,但仍然出现以下错误:

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)

为什么?

共有3个答案

谯德佑
2023-03-14
  1. 捕捉到异常后,应扫描不匹配的输入。您可以使用扫描仪。nextLine(),扫描仪将扫描错误的输入,以便再次启动循环
Integer num1 = null;
do {
   try {
     num1 = scanner.nextInt();
   } catch (InputMismatchException e) {
     System.out.println("Invalid Input, try again!");
     scanner.nextLine();
   }
} while (num1 == null);
胡光霁
2023-03-14

在第一种情况下,当扫描器抛出输入不匹配异常时,它进入无限循环。nextInt() 但在这种情况下,扫描仪不会移动到新行,因此它将获得字符串,而不是预期的int,并将抛出输入不匹配异常。您可以通过以下方式解决此问题:

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

在当前代码中,当InputMismatchException抛出时,它将转到catch块和catch块,然后再次执行scanner。nextInt() 引发异常,循环线程终止。

庞彬
2023-03-14

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

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

我建议您将catch子句中的nextInt替换为nextLine:

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

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

还可以查看stackoverflow上类似的线程,或者使用扫描器类的教程点示例。

 类似资料:
  • 下面的代码询问用户他/她想要多少个赛车手。

  • 问题内容: 可以在Swift中捕获异常吗?给出以下代码: 是否可以防止异常导致整个程序崩溃?也就是说,Objective-C中的Swift等效于什么: 问题答案: 它没有异常处理,并且在开发人员论坛中的讨论讨论了为什么会这样: 但请记住,可可和可可触控传统上并不打算让您捕获异常。他们打算让您不要将它们放在首位。普通错误应使用可选类型和inout NSError参数处理;您应该通过编写更好的代码来解

  • 问题内容: 一旦在此代码中捕获到异常,该方法就会运行,但是一旦我输入一个数字,程序就会关闭,并显示“生成成功”消息。一旦发生异常,是否有任何方法可以返回while循环? 问题答案: 将 try / catch 放入 while循环中 :

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 我有一个开发项目,使用SpringDataJPA和MapStruct在实体和DTO之间进行映射。上周我决定是时候解决vs问题了,我已经推迟了一段时间。我选择使用和在需要时加载属性。但是,在执行从实体到dto的映射时,我遇到了这个问题。我想我知道这在哪里发生,但我不知道如何通过它。 密码 我已经跟踪了当映射器试图映射角色依赖关系时发生的。对象有 中,这不再有效。 有人知道如何避免异常,同时正确映射我