我们需要使用输入格式
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
答案 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!");
}