27

所以我正在构建一个从用户输入中获取整数的程序。我有一个看起来非常简单的 try/catch 块,如果用户没有输入 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 会完全按照它应该做的那样做,并让我再次将其放入。但是,如果我有一个 InputMismatchException,比如为其中一个数字输入 5.5,它只会在无限循环中显示我的错误消息。为什么会发生这种情况,我该怎么办?(顺便说一句,我已经尝试显式输入 InputMismatchException 作为要捕获的参数,但它并没有解决问题。

4

7 回答 7

35

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);

扫描仪的 Javadoc

当扫描器抛出 InputMismatchException 时,扫描器不会传递导致异常的令牌,以便可以通过其他方法检索或跳过它。

于 2012-10-03T04:52:58.353 回答
4

你也可以试试下面的

   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);
于 2012-10-03T05:09:18.260 回答
2

另一种选择是定义 Scanner input = new Scanner(System.in); 在 try 块内,每次您需要重新输入值时都会创建一个新对象。

于 2014-07-29T11:47:09.737 回答
2

要遵循 debobroto das 的答案,您也可以放在后面

input.reset();
input.next(); 

我有同样的问题,当我尝试这个时。它完全修复了它。

于 2016-11-19T19:53:54.747 回答
1

由于在bError = false永远不会到达try block语句,并且该语句被输入所采用的输入,因此它会在无限循环中不断打印错误。

尝试以这种方式使用它hasNextInt()

catch (Exception e) {
            System.out.println("Error!");
           input.hasNextInt();         
        }

或者尝试使用nextLine()耦合Integer.parseInt()来获取输入....

Scanner scan = new Scanner(System.in);

int num1 = Integer.parseInt(scan.nextLine());
int num2 = Integer.parseInt(scan.nextLine());
于 2012-10-03T05:02:08.760 回答
1

为了补充 AmitD 的答案:

只需复制/粘贴您的程序并获得以下输出:

Error!
Enter first num: 
.... infinite times ....

如您所见,指令:

n1 = input.nextInt();

输入双数时不断抛出异常,那是因为您的流未清除。要修复它,请遵循 AmitD 的答案。

于 2012-10-03T05:03:37.783 回答
1

@Limp,您的答案是正确的,只需在读取输入时使用 .nextLine() 即可。示例代码:

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

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

在下面的链接中阅读有关导致此问题的原因的说明。查找我在此线程中发布的详细信息的答案。 Java Homework用户输入问题

好的,我将简要描述一下。当您使用 nextInt() 读取输入时,您只读取了数字部分,但 ENDLINE 字符仍在流中。这是主要原因。现在看看上面的代码,我所做的只是阅读整行并解析它,它仍然会抛出异常并按照您期望的方式工作。您的其余代码工作正常。

于 2012-10-03T05:04:28.777 回答