使用Scanner循环Java InputMismatchException

时间:2014-12-04 15:28:27

标签: java swing exception infinite-loop inputmismatchexception

首先,这是我的课程作业之一。我理解我的教授试图通过这个任务来解释的所有概念,但我有一个愚蠢的问题,它不断循环,并无法弄清楚如何阻止它。

我们需要创建自己的Exception类,并在创建Time(带有小时,分钟和秒)对象时使用它们在特定实例中抛出它们。但是,我对自己的异常类没有问题,我在连续执行InputMismatchException时遇到了问题。

这个类通过一个Scanner对象读取一个文件,该对象有几行,每行包含三个整数,表示军事格式的时间(例如20 15 33),时间是下午8:15:33。但是一旦有一个无效的令牌(例如二十五,33,其中二十不是整数),它就不会停止InputMismatchException捕获块。

这是代码:

public class TimeTestNew
{

public static void main (String[] args)throws IllegalHourException,
        IllegalMinuteException,
        IllegalSecondException,
        FileNotFoundException,
        NumberFormatException
{
    boolean fileFound = false;

    while(!fileFound)
    {
        String input = JOptionPane.showInputDialog("Enter filename: " );

        try
        {
            Scanner in = new Scanner(new File(input));
            fileFound = true;

            while(in.hasNextLine())
            {
                int hour = 0, minute = 0, second = 0;
                try
                {
                    hour = in.nextInt();
                    minute = in.nextInt();
                    second = in.nextInt();
                    Time theTime = new Time(hour,minute,second);
                    System.out.println(theTime);
                }
                catch(IllegalHourException e)
                {
                    System.err.println("Sorry, \"" + e.value 
                            + "\" is an invalid hour.");
                }
                catch(IllegalMinuteException e)
                {
                    System.err.println("Sorry, \"" + e.value 
                            + "\" is an invalid minute.");
                }
                catch(IllegalSecondException e)
                {
                    System.err.println("Sorry, \"" + e.value 
                            + "\" is an invalid second.");
                }
                catch(NumberFormatException | InputMismatchException e)
                {
                    System.err.println("Incorrect format used.");
                    // this is what keeps getting executed

                }

            }

            in.close();

        }
        catch (FileNotFoundException e)
        {
            System.err.println("ERROR: \"" + input + "\" not found\n"
                    + "Please enter a valid filename.");
        }
    }
}
}

这是样本输出:

12:12:12 P.M.
Sorry, "24" is an invalid hour.
1:02:03 A.M.
1:13:13 P.M.
Sorry, "90" is an invalid minute.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
Incorrect format used.
//...and this goes on forever

正如你所看到的,它会在catch块中循环使用“不正确的格式”,一遍又一遍地使用InputMismatchException ......我无法找到让它停止并继续读取文件的方法。

在解释解决方案时,我们将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

问题是,while循环的条件不是输入是否有效,而是文件中是否存在下一行。如果你没有能力在while循环之前验证输入,你应该查看break语句。