2016-02-24 106 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