如何正确扫描LocalDateTime?

时间:2016-02-24 19:48:43

标签: java java.util.scanner

我们需要使用输入格式

dd.MM. HH:mm

对于扫描仪(不使用额外的变量!),如何将这些扫描值放入起始变量?

我的程序不起作用。始终打印“输入无效!”虽然我的意见似乎没有错:

System.out.println("Start:");
sc.nextLine();
sc.findInLine("(\\d\\d)\\.(\\d\\d)\\. (\\d\\d):(\\d\\d)");
try{
    MatchResult mr =sc.match();
    int month = Integer.parseInt(mr.group(2));
    int day = Integer.parseInt(mr.group(1));
    int hour = Integer.parseInt(mr.group(3));
    int minute = Integer.parseInt(mr.group(4));
    LocalDateTime start = LocalDateTime.of(year, month, day, hour, minute);
    System.out.println(start);
} catch (IllegalStateException e) 
{
    System.err.println("Invalid input!");
}

我的意见:

20.08 13:00

1 个答案:

答案 0 :(得分:1)

打印sc.nextLine();后,您不应该致电Start:。这有效地告诉扫描仪读取您正在打印的行20.08. 13:00并忽略它,因为您没有存储结果。然后,当您调用findInLine时,扫描程序会尝试匹配下一个输入行(我猜这是空的,你只是第二次点击 Enter )但是失败了。

然后,由于未进行匹配,sc.match()会引发IllegalStateException

  

返回此扫描仪执行的上次扫描操作的匹配结果。如果未执行匹配,或者最后一次匹配不成功,则此方法抛出IllegalStateException

所以更正的代码是:

Scanner sc = new Scanner(System.in);
System.out.println("Start:");
// sc.nextLine();  <-- don't do that, this reads and ignore your input
sc.findInLine("(\\d\\d)\\.(\\d\\d)\\. (\\d\\d):(\\d\\d)");
try {
    MatchResult mr = sc.match();
    int month = Integer.parseInt(mr.group(2));
    int day = Integer.parseInt(mr.group(1));
    int hour = Integer.parseInt(mr.group(3));
    int minute = Integer.parseInt(mr.group(4));

    LocalDateTime start = LocalDateTime.of(2015, month, day, hour, minute);
    System.out.println(start);
} catch (IllegalStateException e) {
    System.err.println("Invalid input!");
}