尝试/捕获输入不匹配异常创建无限循环

2022-09-01 14:12:42

所以我正在构建一个程序,它从用户输入中获取int。我有一个似乎非常简单的尝试/捕获块,如果用户没有输入int,应该重复该块,直到他们这样做。以下是代码的相关部分:

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


public class Except {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        boolean bError = true;
        int n1 = 0, n2 = 0, nQuotient = 0;

        do {
            try {
                System.out.println("Enter first num: ");
                n1 = input.nextInt();
                System.out.println("Enter second num: ");
                n2 = input.nextInt();
                nQuotient = n1/n2;
                bError = false;
            } 
            catch (Exception e) {
                System.out.println("Error!");
            }
        } while (bError);

        System.out.printf("%d/%d = %d",n1,n2, nQuotient);
    }
}

如果我为第二个整数输入一个0,那么try/catch会完全按照它应该做的事情,让我再次输入它。但是,如果我有一个输入不匹配异常,比如在其中一个数字中输入5.5,它只会在无限循环中显示我的错误消息。为什么会发生这种情况,我该怎么办?(顺便说一句,我尝试显式键入 InputMismatchException 作为要捕获的参数,但它没有解决问题。


答案 1

收到错误时,您需要调用。此外,建议使用next();hasNextInt()

       catch (Exception e) {
            System.out.println("Error!");
           input.next();// Move to next other wise exception
        }

在读取整数值之前,您需要确保扫描仪有一个。而且您不需要这样的异常处理。

    Scanner scanner = new Scanner(System.in);
    int n1 = 0, n2 = 0;
    boolean bError = true;
    while (bError) {
        if (scanner.hasNextInt())
            n1 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        if (scanner.hasNextInt())
            n2 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        bError = false;
    }
    System.out.println(n1);
    System.out.println(n2);

Scanner 的 Javadoc

当扫描程序引发 InputMismatchException 时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该标记。


答案 2

您也可以尝试以下

   do {
        try {
            System.out.println("Enter first num: ");
            n1 = Integer.parseInt(input.next());

            System.out.println("Enter second num: ");
            n2 = Integer.parseInt(input.next());

            nQuotient = n1/n2;

            bError = false;
        } 
        catch (Exception e) {
            System.out.println("Error!");
            input.reset();
        }
    } while (bError);