簡體   English   中英

在 Java 中,while(input.hasNext()) 內的多個 input.next() 觸發 NoSuchElementException

[英]Multiple input.next() inside of a while(input.hasNext()) triggers NoSuchElementException in Java

我有一個文本文件

Jim,A,94
Pam,B-4,120
Michael,CC,3

我想將由逗號分隔的每個標記保存到字符串變量中。 我有這個代碼:

File f = new File(filename);
Scanner input = new Scanner(f);
input.useDelimiter(",");

while (input.hasNext())
{
    String s1 = input.next();
    String s2 = input.next();
    String s3 = input.next();
}

input.close();

但這會不斷觸發 NoSuchElementException。 我在這里做錯了什么?

這是Scanner#next()工作方式的一個微妙的怪癖。 該方法查找“標記”,它是分隔符出現之間的所有內容。 默認分隔符是"\\\\p{javaWhitespace}+" ,其中包括\\n\\r

您將分隔符更改為逗號,並且僅更改了逗號. 對於您的Scanner ,輸入如下所示:

Jim,A,94\nPam,B-4,120\nMichael,CC,3

掃描儀看到的令牌是:

Jim
A
94\nPam
B-4
120\nMichael
CC
3

這只有 7 個標記,因此您在滿足所有next()調用之前到達輸入的末尾。

最簡單的解決方法是將分隔符設置為"[," + System.lineSeparator() + "]"

然而, Scanner是新開發人員無盡錯誤和挫折的原因,應該被棄用和放逐(由於現有的代碼庫,這不會發生)。 您應該做的是閱讀整行,然后自己解析它們。

您有一個自定義分隔符, 因此,您的輸入字符串由分隔,該字符前后的所有內容都將構成.next();返回的標記.next(); .

\\n轉義字符,作為換行符出現在您的輸入中, 也是一個字符

\\n (linefeed LF, Unicode \ )

並且它正在被讀取為您的令牌的一部分。

這是實現您想要做的事情的另一種方法:

File f = new File(filename);
Scanner input = new Scanner(f);

while (input.hasNext()) {
    String[] sarray = input.nextLine().split(",");
    for (String s : sarray ) {
        System.out.println(s);
    }
}

當然,這可以改進,但基本上我建議您使用Scanner逐行讀取文件,然后用逗號分隔符分割。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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