做无限循环

问题描述 投票:2回答:5

我正在尝试编写一个方法,询问用户是否为正整数。如果未输入正整数,则输出消息“请输入正值”。这部分不是问题。问题在于,当我尝试实现捕获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;
    } 
java try-catch do-while
5个回答
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();
        }
    }
}

0
投票

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

我希望我帮忙!


0
投票

您可以在do-while-loop的开头声明扫描程序,因此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;
} 

0
投票

这确实几乎与SO: Java Scanner exception handling相同

两个问题:

  • 你的异常处理程序需要一个scanner.next(); ......和......
  • 你真的不需要两个循环。一个循环就可以了: 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; }

0
投票

只需在捕获物中添加一个break语句即可。 顺便说一句,你可以通过重写它来摆脱while循环:

try {
    variable = scanner.nextInt();
    if (variable < 0) {
        System.out.println("Please enter a positive value");
    } else {
        properValue = true;
    }
}
//... 
© www.soinside.com 2019 - 2024. All rights reserved.