【问题标题】:How do I fix a NoSuchElementException from a input file?如何修复输入文件中的 NoSuchElementException?
【发布时间】:2020-01-03 03:40:56
【问题描述】:

我想知道是否有人可以在我的程序中帮助解决这个 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)

mainTest 类:

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

(抱歉需要你从谷歌驱动器下载它,文件太长了,如果我粘贴了 500,000 行,我可能会被报告或其他什么)

【问题讨论】:

  • 如果您也共享异常日志会更有帮助。
  • 是的,每行包含三个字符串。第一个是一个int,另外两个是一个名字字符串和一个姓氏。
  • stackoverflow.com/a/50750997/9020698 我相信 LargeDataSet.txt 在您的类路径中不存在。您可以尝试提供完整路径。

标签: java java.util.scanner nosuchelementexception


【解决方案1】:

请使用scan1.hasNext() 而不是scan1.hasNextLine()

while (scan1.hasNext()) {
        scan1.next();
        String data = scan1.next() + " " + scan1.next();
        bigBoi.add(data);
}

【讨论】:

    【解决方案2】:

    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]);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多