2016-02-24 72 views
0

我们需要使用的输入格式如何正确扫描LocalDateTime?

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

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

然后,因为没有匹配的制作,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!"); 
} 
+0

不直接工作-.- 输出: “无效的输入” – Johnny

+0

@Johnny注意你的问题中的输入是'20.08 13:00',它缺少一个点,它应该是'20.08。 13:00'。你测试过了吗? – Tunaki

+0

嘿,男人非常感谢! Finaly它的工作原理:-) 我的输入是不断错误的,最后一个点始终缺失! – Johnny