簡體   English   中英

Java Scanner類提供java.util.NoSuchElementException

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM