如何修复输入文件中的 NoSuchElementException?
How do I fix a NoSuchElementException from a input file?
我想知道是否有人可以帮助解决我的程序中的这个 NoSuchElements 异常,该异常扫描一个非常大的文本,然后添加到 ArrayList。
我已经尝试重新安排代码的顺序以查看是否可以修复它,但现在我不知道如何修复它。
异常本身:
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1478)
at mainTest.main(mainTest.java:11)
主测试class:
import java.io.*;
import java.util.*;
public class mainTest {
public static void main(String args[]) throws FileNotFoundException {
ArrayList<String> bigBoi = new ArrayList<>(500000);
Scanner scan1 = new Scanner(new File("LargeDataSet.txt"));
while (scan1.hasNextLine()) {
scan1.next();
String data = scan1.next() + " " + scan1.next();
bigBoi.add(data);
}
ArrayList<String> successful = new ArrayList<>(500000);
}
}
.txt 文件的单位:
https://drive.google.com/file/d/1MWfMKMhSvuopOt9WwquABgYBTt0M4eLA/view?usp=sharing
(很抱歉需要您从 google 驱动器下载它,文件太长了,如果我粘贴了 500,000 行,我可能会被举报或发生其他事情)
请检查 scan1.hasNext()
而不是 scan1.hasNextLine()
:
while (scan1.hasNext()) {
scan1.next();
String data = scan1.next() + " " + scan1.next();
bigBoi.add(data);
}
LargeDataSet.txt
末尾有一个空行,对 scan1.hasNextLine()
检查有效,但 scan1.next()
抛出 NoSuchElementException
,因为没有可读的内容。
按照接受的答案中的建议将验证更改为 scan1.hasNext()
解决了该问题,但如果任何行中的条目少于 3 个并且接受条目超过 3 个的行,程序仍可能崩溃。
更好的做法是验证所有外部提供的数据:
while (scan1.hasNextLine()) {
String line = scan1.nextLine();
String[] tokens = line.split("\s+"); //split by space(s)
if(tokens.length != 3) { //expect exactly 3 elements on each line
throw new IllegalArgumentException("Invalid line: " + line);
}
bigBoi.add(tokens[1] + " " + tokens[2]);
}
我想知道是否有人可以帮助解决我的程序中的这个 NoSuchElements 异常,该异常扫描一个非常大的文本,然后添加到 ArrayList。
我已经尝试重新安排代码的顺序以查看是否可以修复它,但现在我不知道如何修复它。
异常本身:
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1478)
at mainTest.main(mainTest.java:11)
主测试class:
import java.io.*;
import java.util.*;
public class mainTest {
public static void main(String args[]) throws FileNotFoundException {
ArrayList<String> bigBoi = new ArrayList<>(500000);
Scanner scan1 = new Scanner(new File("LargeDataSet.txt"));
while (scan1.hasNextLine()) {
scan1.next();
String data = scan1.next() + " " + scan1.next();
bigBoi.add(data);
}
ArrayList<String> successful = new ArrayList<>(500000);
}
}
.txt 文件的单位: https://drive.google.com/file/d/1MWfMKMhSvuopOt9WwquABgYBTt0M4eLA/view?usp=sharing
(很抱歉需要您从 google 驱动器下载它,文件太长了,如果我粘贴了 500,000 行,我可能会被举报或发生其他事情)
请检查 scan1.hasNext()
而不是 scan1.hasNextLine()
:
while (scan1.hasNext()) {
scan1.next();
String data = scan1.next() + " " + scan1.next();
bigBoi.add(data);
}
LargeDataSet.txt
末尾有一个空行,对 scan1.hasNextLine()
检查有效,但 scan1.next()
抛出 NoSuchElementException
,因为没有可读的内容。
按照接受的答案中的建议将验证更改为 scan1.hasNext()
解决了该问题,但如果任何行中的条目少于 3 个并且接受条目超过 3 个的行,程序仍可能崩溃。
更好的做法是验证所有外部提供的数据:
while (scan1.hasNextLine()) {
String line = scan1.nextLine();
String[] tokens = line.split("\s+"); //split by space(s)
if(tokens.length != 3) { //expect exactly 3 elements on each line
throw new IllegalArgumentException("Invalid line: " + line);
}
bigBoi.add(tokens[1] + " " + tokens[2]);
}