无限循环时做

时间:2018-09-01 23:54:05

标签: java try-catch do-while

我正在尝试编写一种向用户询问正整数的方法。如果未输入正整数,则将输出一条消息,提示“请输入正值”。这部分不是问题。问题是,当我尝试实现捕获InputMismatchExceptions的try catch语句(以防用户意外输入字符或字符串)时,循环将无限运行并吐出与InputMistmatchException相关的错误消息。

这是我的代码:

private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                while (true) {
                    variable = scanner.nextInt();
                    if (variable < 0) {
                        System.out.println("Please enter a positive value");
                    } else if (variable >= 0) {
                        break;
                    }
                }
                properValue = true;
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
            }
        } while (properValue == false);
        return variable;
    } 

5 个答案:

答案 0 :(得分:2)

基本上,正在发生的是,当给定令牌无效时,扫描程序会遇到错误,因此它无法超过该值。当下一次迭代再次开始备份时,scanner.nextInt()再次尝试扫描下一个输入值,该值仍然是无效的,因为它永远不会过去。

您想要做的就是添加行

scanner.next(); 

在您的catch子句中基本上说跳过该令牌。

侧面说明:您的方法通常太长。您可以将其缩短为此。

private static int nonNegativeInt() {
    int value = 0;
    while (true) {
        try {
            if ((value = scanner.nextInt()) >= 0)
                return value;
            System.out.println("Please enter a positive number");
        } catch (InputMismatchException e) {
            System.out.println("That is not a valid value");
            scanner.next();
        }
    }
}

答案 1 :(得分:0)

您正在捕获异常,但没有更改变量适当值的值,因此catch语句将永远运行。在catch语句中添加properValue = true;甚至break语句将为您提供所需的功能!

希望我能帮上忙!

答案 2 :(得分:0)

只需在您的捕获中添加一个break语句即可。
顺便说一句,您可以像这样重写它来摆脱while循环:

try {
    variable = scanner.nextInt();
    if (variable < 0) {
        System.out.println("Please enter a positive value");
    } else {
        properValue = true;
    }
}
//... 

答案 3 :(得分:0)

您可以在do-while循环开始时声明扫描程序,因此nextInt()不会一遍又一遍地引发异常。

private static int nonNegativeInt(){
    boolean properValue = false;
    int variable = 0;
    do {
        scanner = new Scanner(System.in);
        try {
            while (true) {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                } else if (variable >= 0) {
                    break;
                }
            }
            properValue = true;
        } catch (InputMismatchException e){
            System.out.println("That is not a valid value.");
        }
    } while (properValue == false);
    return variable;
} 

答案 4 :(得分:0)

这确实与SO: Java Scanner exception handling

几乎相同

两个问题:

  • 您的异常处理程序中需要一个scanner.next();

    ... AND ...

  • 您实际上并不需要两个循环。一个循环就可以了:

    private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                    continue;
                 } else if (variable >= 0) {
                    properValue = true;
                 }
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
                scanner.next();
            }
        } while (properValue == false);
        return variable;
    }