为什么我的代码会跳转到catch部分?

时间:2015-11-15 09:41:54

标签: java

public static void main(String[] args) {

    Scanner consoleScanner = new Scanner(System.in);

    int hour = 0;
    int minute = 0;
    String meridiem = "";
    String zero = "";
    boolean errorOccured = false;

    do {

        try {
            System.out.print("Please enter the hour:");
            hour = consoleScanner.nextInt();
            System.out.println("Please enter the minute:");
            minute = consoleScanner.nextInt();
            if (minute <= 9)
                zero = "0";
            System.out.println("Please enter either \"AM\" or \"PM\":");
            meridiem = consoleScanner.nextLine();

            if (hour < 1 || hour > 12) {
                throw new InvalidHourException();
            }
            if (minute < 0 || minute > 59) {
                throw new InvalidMinuteException();
            }
            if (!meridiem.equals("AM") || !meridiem.equals("PM")) {
                throw new InvalidMeridiemException();
            }

        } catch (InvalidHourException hourEx) {
            System.out.println(hourEx.getMessage());
        } catch (InvalidMinuteException minuteEx) {
            System.out.println(minuteEx.getMessage());
        } catch (InvalidMeridiemException meriEx) {
            System.out.println(meriEx.getMessage());
        }

    } while (errorOccured);

    System.out.println(hour + ":" + zero + minute + meridiem + " is a valid time.");

}

}

我的输出如下:

请输入小时:1 请输入分钟:3 请输入“AM”或“PM”: 请输入AM或PM。 1:03是一个有效的时间。

我想知道为什么它不让我设置AM或PM而只是跳到例外?

2 个答案:

答案 0 :(得分:1)

这种情况总会引发异常,因为meridiem不能同等于“AM”和“PM”:

        if (!meridiem.equals("AM") || !meridiem.equals("PM")) {
            throw new InvalidMeridiemException();
        }

应该是:

        if (!meridiem.equals("AM") && !meridiem.equals("PM")) {
            throw new InvalidMeridiemException();
        }

答案 1 :(得分:0)

除了@Eran所说的内容之外,你还必须改变这个

meridiem = consoleScanner.nextLine();

通过

meridiem = consoleScanner.next();

原因:nextLine使此扫描器超过当前行并返回跳过的输入,然后查找并返回此扫描器中的下一个完整令牌。

有关详细说明,请参阅此处:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html