【问题标题】:Error in while loop. It will not stop Javawhile 循环中的错误。它不会停止 Java
【发布时间】:2011-04-09 17:05:41
【问题描述】:

大家好,我有以下 while 循环,似乎不会停止。它应该询问用户一个小时。我正在尝试捕捉用户未输入数字的事件。

即 输入小时: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;
        }
}

【问题讨论】:

    标签: java loops while-loop


    【解决方案1】:

    Scanner scanner = ... 移动到 while 循环中。

    【讨论】:

    • 谢谢,作品。那么为什么必须将它放在 while 循环中呢?
    • 所做的一切就是让您拥有十亿台扫描仪。它根本没有任何性能优势。
    • @Tony 答案在于您的问题的文档和其他答案。你应该阅读它们。
    【解决方案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");
        }
    }
    

    【讨论】:

    • 如果用户输入“F 3”并回车,这个炸弹不应该在什么时候获得3?
    【解决方案3】:

    打印异常后可以添加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;
    

    【讨论】:

    • 如果您在同一行中有小时、分钟和秒,那将是一个坏主意。而且我不完全确定你为什么要这样做......
    • 如果他得到的只是几个小时,这不会是一个坏主意,并且无论如何都会抛出异常。我不是作为单独的函数而是在 main 中运行相同的代码并得到相同的结果。为什么?我不确定,但可能是因为它会将打印的错误输入扫描仪。
    【解决方案4】:

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

    例如

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

    【讨论】:

    • 这没有同样的效果。如果这条线是“12 13 14”,它会轰炸你。您也无法访问您的分钟和秒数。
    • Scanner 的分隔符可以改为空格,然后使用scanner.next() 代替scanner.nextLine()。然后可以对每个值使用 Integer.parseInt。
    • 是的,所以 .next() 将返回下一个字符串。然后可以单独解析整数并捕获任何错误。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-30
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2020-03-23
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多