[英]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.