[英]Java Scanner class gives java.util.NoSuchElementException
我試圖通過現有問題來查找,但沒有發現與我的問題相符的內容。
我正在嘗試從具有30000行的ftp服務器讀取文本文件。 每行都是一個帶有〜分隔值的記錄。
一旦獲得記錄和這些值,便將它們插入表中。
我正在使用一個掃描程序類來掃描文件,然后對於每個記錄,我正在使用另一個帶有〜分隔符的掃描程序類來讀取這些記錄。
該程序每天運行,並且大部分時間都可以正常運行。
但是有時會由於NoSuchElementException而失敗。
我的日志顯示在某個時候..說24000條記錄后,nextline掃描儀獲取未完成..它獲取了部分行,然后定界的掃描儀無法讀取下一個值並給出此錯誤。
如果我在相同的源文件上再次運行該程序。 它將毫無問題地運行。 我不確定這是否與環境或數據大小或代碼有關。是否需要檢查任何輸入或方向? 或任何更好的建議。
我編寫的方法的代碼段:
掃描儀讀取=新的掃描儀; //是輸入流
String telNo, usrID, srvTyp, status, line;
read.nextLine(); // i am purposely skipping the first line
while (read.hasNextLine()) {
m_LogMgr.logMessage(LogManager.LOG_EVENT,
"before read.nextLine", 10, 2);
line = read.nextLine();
m_LogMgr.logMessage(LogManager.LOG_EVENT, line, 10, 2);
if (line == null || line.trim().length() < 1) {
m_LogMgr.logMessage(LogManager.LOG_EVENT,
"continue as i got a blank line", 10, 2);
continue;
}
Scanner read1 = new Scanner(line);
m_LogMgr.logMessage(LogManager.LOG_EVENT,
"after new read1 scanner", 10, 2);
read1.useDelimiter("~");
telNo = read1.next();
usrID = read1.next();
srvTyp = read1.next();
status = read1.next();
m_LogMgr.logMessage(LogManager.LOG_EVENT, telNo + " " + usrID
+ " " + srvTyp + " " + status, 10, 2);
callInsert(telNo, usrID, srvTyp, status);
m_LogMgr.logMessage(LogManager.LOG_EVENT, "after insert", 10, 2);
read1.close();
}
read.close();
.. ..最后,我關閉輸入流並斷開ftpclient的連接。
來自源文件的樣本記錄:
8030180001〜tdurgin1〜INA〜ÿ
8030180001〜katrn50〜IO15〜ÿ
8030180002〜里奇堡〜IO15〜d
失敗時記錄:
2018-03-05 04:48:10.846 8433823735〜bobbyteetor〜BN222〜Y
2018-03-05 04:48:10.855新的read1掃描儀之后
2018-03-05 04:48:10.861 8433823735 bobbyteetor BN222 Y
插入后2018-03-05 04:48:10.882
read.nextLine之前的2018-03-05 04:48:10.895
2018-03-05 04:48:10.905 8433823736〜gra
2018年3月5日04:48:10.906新的read1掃描儀之后
2018-03-05 04:48:10.991 e.toString = java.util.NoSuchElementException
顯然,問題是您的行8433823736~gra
缺少足夠的令牌來進行所有必要的next()
調用。
考慮使用if(read1.hasNext())
來確保首先擁有下一個標記。
附帶說明的是,為每條線創建一個掃描儀有點過分。 考慮只做String[] tokens = read1.next().split("~");
並使用tokens[0]
等。然后您馬上就知道,因為您應該有4個令牌,所以if(tokens.length != 4) System.out.println("Skipping line " + line + " because it is malformed");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.