扫描仪和Try-Catch的奇怪行为

时间:2016-03-18 21:46:35

标签: java java.util.scanner

已编辑(2016年3月18日下午9:10):

我正在尝试编写一个循环的程序,直到用户输入有效值 - 月,日和年。请注意,year是一个字符串,以便在程序的后面,如果年份类似于" 01"那么我可以正确打印出来。

while (true){
  try{
    System.out.println("Please enter a month in numeric form");
    month = input.nextInt();
    System.out.println("Please enter a day in numeric form");
    day = input.nextInt();
    System.out.println("Please enter a two-digit year");
    if (input.hasNextInt() == true){
        year = input.next();
    }
    else{
        throw new java.util.InputMismatchException();
    }
    break;
  }
  catch(Exception e){
    System.err.println(e);
    System.out.println("\nOne of your inputs was not valid.");
    System.out.println(input.nextLine()); // problem line
  }
}

catch块的最后一行似乎导致奇怪的行为。我已决定打印该行以查看input.nextLine()包含的内容;如果我将它保留为input.next(),程序将完美运行。 如果我在上面的代码中输入年份的一些错误输入,那么这是输出:

Please enter a month in numeric form
8
Please enter a day in numeric form
2
Please enter a two-digit year
badinput
java.util.InputMismatchException

One of your inputs was not valid.
Please enter a month in numeric form
java.util.InputMismatchException

One of your inputs was not valid.
badinput
Please enter a month in numeric form

我应该得到的输出(如果我将其保留为input.next(),会发生什么)

Please enter a month in numeric form
8
Please enter a day in numeric form
2
Please enter a two-digit year
badinput
java.util.InputMismatchException

One of your inputs was not valid.
badinput
Please enter a month in numeric form

这是一个微小的差异,但我认为我理解nextLine()和next()的行为 - 现在它清楚我的直觉是错误的。根据我的理解,next()消耗当前令牌而nextLine()消耗整个当前行 - 他们不应该在这里做同样的事情吗?有人可以解释一下吗?

0 个答案:

没有答案