用nextInt里面的try-catch语句,正确的实现方式?

时间:2014-11-13 13:01:45

标签: java

我正在尝试构建最简单的解决方案,仅使用nextInt()方法从用户读取整数,并抛出异常以排除错误... 这是我现在的代码:

Scanner sn = new Scanner(System.in);

    boolean inputNotNull = true;
    while (inputNotNull) {
        try {
            int number = sn.nextInt();

            System.out.printf("The number %d is power of 2: %b\n", number, isPowerOfTwo(number));
            if (number == 0) {
                inputNotNull = false;
            }
        }
        catch(InputMismatchException e) {
            System.err.println("Wrong input! Input only integer numbers please...");
    }

    }

所以,这应该是等待用户的整数。如果用户输入 0 结束该程序。 我的想法是当用户使用 InputMismatchException 输入除整数以外的其他内容时尝试排除场景(我知道这不是捕获RuntimeException的最佳做法)。当引发异常时,将打印一条错误消息,程序将返回到while循环,再次询问输入是否发生。

我在这里使用的方法有一个缺陷,当用户输入的内容不是整数值时,程序会重复打印错误消息,永远循环。

如何避免这种情况?

作为一个侧面问题,您如何解决我想要解决的问题?

3 个答案:

答案 0 :(得分:0)

无限循环的原因是当您尝试输入输入时,按下回车键,调用nextInt时,扫描仪会忽略该额外字符(输入)。因此,当您输入无效数字时,您会获得异常,并且扫描仪再次看到输入字符,因为您没有消耗该字符,因此您永远不会出现它。

为了避免它在你遇到异常时尝试使用该字符:

catch (InputMismatchException e) {
    System.err.println("Wrong input! Input only integer numbers please...");
    sn.nextLine();
}

这应该可以解决您的问题。

答案 1 :(得分:0)

int Scanner::nextInt(int radix)

将输入的下一个标记扫描为int。返回从输入中扫描的int。 抛出: InputMismatchException - 如果下一个标记与整数正则表达式不匹配,或者超出范围 NoSuchElementException - 如果输入已用尽 IllegalStateException - 如果此扫描仪已关闭

你的方法是正确的。 您需要在捕获中添加:

sn.nextLine(); // eats up newline char

如果用户重复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。 您可以添加另一个异常NoSuchElementException,如果输入已用尽,则退出循环

答案 2 :(得分:0)

Scanner sn = new Scanner(System.in);

boolean inputNotNull = true;
while (inputNotNull) {
    String line = sn.nextLine();
    Integer number = null;
    try {
        number = Integer.parseInt(line);
    } catch (NumberFormatException e) {
        System.err.println("Wrong input! Input only integer numbers please: " + e.getMessage());
        continue;
    }
    System.out.printf("The number %d is power of 2: %b\n", number, isPowerOfTwo(number));
    if (number == 0) {
        inputNotNull = false;
    }
}