Java 在使用nextInt时尝试内部catch语句,正确的实现方法?

Java 在使用nextInt时尝试内部catch语句,正确的实现方法?,java,Java,我正在尝试构建一个最简洁的解决方案,只使用nextInt()方法和它抛出的排除错误的异常来读取用户的整数。。。 这是我目前拥有的代码: Scanner sn = new Scanner(System.in); boolean inputNotNull = true; while (inputNotNull) { try { int number = sn.nextInt(); System.out.printf(

我正在尝试构建一个最简洁的解决方案,只使用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循环,在未发生任何事件时再次请求输入

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

如何避免这种情况


作为一个附带问题,您将如何解决我试图解决的这个问题?

无限循环的原因是,当您尝试输入输入时,按enter键,在调用nextInt时,扫描仪将忽略额外字符(enter)。所以,当你们输入无效的数字时,你们会得到异常,扫描器会再次看到输入字符,因为你们并没有使用那个字符,所以你们永远也出不来

为了避免出现异常,请尝试在出现以下异常时使用该字符:

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

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

无限循环的原因是,当您尝试输入输入时,按enter键,在调用nextInt时,扫描仪会忽略额外的字符(enter)。所以,当你们输入无效的数字时,你们会得到异常,扫描器会再次看到输入字符,因为你们并没有使用那个字符,所以你们永远也出不来

int Scanner::nextInt(int radix)
为了避免出现异常,请尝试在出现以下异常时使用该字符:

catch (InputMismatchException e) {
    System.err.println("Wrong input! Input only integer numbers please...");
    sn.nextLine();
}
这应该能解决你的问题

int Scanner::nextInt(int radix)
将输入的下一个标记扫描为int。返回从输入扫描的int。 抛出:
InputMismatchException
-如果下一个标记与整数正则表达式不匹配或超出范围
NoTouchElementException
-如果输入用尽
非法状态异常
-如果此扫描仪已关闭

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

sn.nextLine(); // eats up newline char
如果用户反复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。 您可以添加另一个异常
NoTouchElementException
,如果输入耗尽,则从循环中退出

将输入的下一个标记扫描为int。返回从输入扫描的int。 抛出:
InputMismatchException
-如果下一个标记与整数正则表达式不匹配或超出范围
NoTouchElementException
-如果输入用尽
非法状态异常
-如果此扫描仪已关闭

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

sn.nextLine(); // eats up newline char
如果用户反复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。 您可以添加另一个异常
NoSuchElementException
,如果输入耗尽,则退出循环捕获未检查的异常通常是一种不好的做法,我建议:

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;
    }
}
捕获未检查的异常通常是一种不好的做法,我建议:

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

为什么不直接获取行(字符串,而不是int)并尝试将其解析为int?您不需要捕获异常,这会将您带到下一行。您为什么不获取该行(字符串,而不是int)并尝试将其解析为int?您不需要捕获异常,这将使您进入下一行可能的重复