gpt4 book ai didi

Java Scanner 类给出 java.util.NoSuchElementException

转载 作者:行者123 更新时间:2023-12-02 11:33:23 25 4
gpt4 key购买 nike

我尝试查看现有问题,但没有看到任何与我的问题相符的内容。

我正在尝试从 ftp 服务器读取一个包含 30000 行的文本文件。每行都是一 strip 有 ~ 分隔值的记录。

一旦我获得一条记录和这些值,我会将它们插入到表中。

我使用扫描仪类来扫描文件,然后对于每条记录,我使用另一个带有 ~ 分隔符的扫描仪类来读取这些记录。

该程序每天运行,大部分时间都可以顺利完成。

但偶尔会因 NoSuchElementException 失败。

我的日志显示,在某个时刻.. 比如说在 24000 条记录之后,下一行扫描仪获取的数据不完整。. 它获取部分行,然后分隔扫描仪无法读取下一个值并给出此错误。

如果我在同一个源文件上再次运行该程序。它将毫无问题地运行。我不确定这是否与环境或数据大小或代码有关。任何输入或检查方向将非常感激。或者有什么更好的建议..

我编写的方法的代码片段:

扫描仪读取 = 新扫描仪(is);//is 是输入流

        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~Y

8030180001~katrn50~IO15~Y

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 插入后

2018-03-05 04:48:10.895 在 read.nextLine 之前

2018-03-05 04:48:10.905 8433823736~gra

2018-03-05 04:48:10.906 在新的 read1 扫描仪之后

2018-03-05 04:48:10.991 e.toString =java.util.NoSuchElementException

最佳答案

显然,问题在于您的行 8433823736~gra 缺少足够的 token 来进行所有必要的 next() 调用。

考虑使用 if(read1.hasNext()) 确保您首先拥有下一个 token 。

附带说明的是,为每一行创建一个扫描仪有点过大了。考虑只做 String[] tokens = read1.next().split("~"); 并使用 tokens[0] 等。然后你马上就知道了,因为你应该有 4 个 token , if(tokens.length != 4) System.out.println("Skipping line "+ line + "because it is malformed");

关于Java Scanner 类给出 java.util.NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49116108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com