while循环错误。它不会阻止Java

时间:2011-04-09 17:05:42

标签: java loops while-loop

嘿伙计们,我有以下的循环似乎没有停止。应该问用户一个小时。我正试图抓住用户没有输入数字的事件。

即。 输入小时:foo 您没有输入有效值

然后它应该允许用户再次输入一小时的值,但它会一遍又一遍地打印错误消息

    private static void setTime(Clock clock){
        int hours = -1;
        int minutes = -1;
        int seconds = -1;

        Scanner scanner = new Scanner(System.in);

        while(true)
        {
            try{
                System.out.print("Enter hours: ");
                hours = scanner.nextInt();          
            }
            catch(NumberFormatException nfe){
                System.out.println("Input was not an integer, please try again");
                continue;
            }
            catch(InputMismatchException ims){
                System.out.println("Input was not an integer, please try again");
                continue;
            }
            break;
        }
}

5 个答案:

答案 0 :(得分:4)

Scanner scanner = ...移至while循环中。

答案 1 :(得分:2)

来自文档:

  

当扫描仪抛出时   InputMismatchException,扫描程序   不会传递导致的令牌   例外,这样可能   通过其他方式检索或跳过   方法

在重新启动循环之前,您必须阅读错误的答案,否则它会一次又一次地读取相同的内容。

根据文档nextInt(),永远不会返回NumberFormatException,因此无需对其进行测试。

你也可以像这样使用hasNextInt()

while(true) {
    if(scanner.hasNextInt()) {
        hours = scanner.nextInt();
        break;
    } else {
        scanner.next();
        System.out.println("You must enter an integer");
    }
}

答案 2 :(得分:1)

您可以在打印例外后添加scanner.nextLine();

要明确:

try{
                System.out.print("Enter hours: ");

                hours = scanner.nextInt();          
            }
            catch(NumberFormatException nfe){
                System.out.println("Input was not an integer, please try again");
                scanner.nextLine();
                continue;
            }
            catch(InputMismatchException ims){
                System.out.println("I--nput was not an integer, please try again");
                scanner.nextLine();
                continue;
            }
            break;

答案 3 :(得分:1)

您是否首先尝试从扫描器读取字符串,然后尝试将其解析为整数?

e.g。

String line = scanner.nextLine();
hours = Integer.parseInt(line);

答案 4 :(得分:1)

这是因为如果解析成功,则scanner.nextInt()仅移动到下一个标记(请参阅Javadoc)。