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