如何修复输入文件中的 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]);
}