Java 如何修复输入文件中的NoTouchElementException?
我想知道是否有人可以帮助解决我的程序中的NoTouchElements异常,该程序扫描一个非常大的文本,然后添加到ArrayList中 我试着重新安排代码的顺序,看看是否可以修复它,但现在我不知道如何修复它Java 如何修复输入文件中的NoTouchElementException?,java,java.util.scanner,nosuchelementexception,Java,Java.util.scanner,Nosuchelementexception,我想知道是否有人可以帮助解决我的程序中的NoTouchElements异常,该程序扫描一个非常大的文本,然后添加到ArrayList中 我试着重新安排代码的顺序,看看是否可以修复它,但现在我不知道如何修复它 例外本身: Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/
例外本身:
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)
主要测试类别:
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);
}
}
import java.io.*;
导入java.util.*;
公共类测试{
公共静态void main(字符串args[])引发FileNotFoundException{
ArrayList bigBoi=新ArrayList(500000);
Scanner scan1=新扫描仪(新文件(“LargeDataSet.txt”);
while(scan1.hasNextLine()){
scan1.next();
字符串数据=scan1.next()+“”+scan1.next();
添加(数据);
}
ArrayList successful=新建ArrayList(500000);
}
}
.txt文件的单位:
(很抱歉需要您从谷歌硬盘下载,文件太长了,如果我粘贴了500000行,我可能会被报告或其他什么)请使用
scan1.hasNext()
而不是scan1.hasNextLine()
:
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]);
}
如果您也共享异常日志,它会更有帮助。是的,它每行有三个字符串。第一个是int,另外两个是一个名字字符串和一个姓氏。我相信LargeDataSet.txt不在类路径中。您可以通过提供完整路径进行尝试。
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]);
}