Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复输入文件中的NoTouchElementException?_Java_Java.util.scanner_Nosuchelementexception - Fatal编程技术网

Java 如何修复输入文件中的NoTouchElementException?

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/

我想知道是否有人可以帮助解决我的程序中的NoTouchElements异常,该程序扫描一个非常大的文本,然后添加到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)

主要测试类别:

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