使用 Scanner.next() 时出现 java.util.NoSuchElementException

标签 java exception java.util.scanner

Java 新手正在从事一个项目,我应该在该项目中将从文本文件中获得的数据显示到网格上。项目基本上是写的,但是输出显示这个异常:

run:
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at inputOutput.ReadDataFile.populateData(ReadDataFile.java:50)
    at boggle.Boggle.main(Boggle.java:27)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

Boggle.java:27 链接到我的父类(super class) Boggle.java 的主要方法中的一行代码。该行应该调用我的类 ReadDataFile.java 中的方法之一。该行显示为 dataRead.populateData();(//2. 在下面的评论中),在上下文中,主要方法如下所示:

public static void main(String[] args) {            //main() method begins
    // TODO code application logic here
    ReadDataFile dataRead = new ReadDataFile("BoggleData.txt"); //1. instance of class ReadDataFile created

    dataRead.populateData();                        //2. populateData() method called

    boggleData = dataRead.getData();                //3. member variable set equal to getData() method

    Board boggleBoard = new Board(boggleData);      //4. instance of class Board created, passing data as argument

    boggleBoard.shakeDice();                        //5. shakeDice() method called

}                                                   //main() method ends

ReadDataFile.java:50 链接到我的子类 ReadDataFile.java 中名为 populateData() 的方法中的一行。该行是 input.next(); 并且它位于我为该类创建的 try-catch-finally 的 finally 组件中。在上下文中,populateData() 方法如下所示:

public void populateData(){                 //populateData() method begins          

    try{                                    //try begins

        URL url = getClass().getResource(dataFile); //1. instance of class URL created from file name

        File file = new File(url.toURI());  //2. instance of class File based on url

        input = new Scanner(file);          //3. member variable initialized based on file

        while(input.hasNext()){             //4. while loop goes through data file

            data.add(input.next());         //a. data from file added to ArrayList
        }
    }                                       //try ends

    catch(Exception ex){                    //catch begins
        System.out.println(ex.toString());
        ex.printStackTrace();
    }                                       //catch ends

    finally{                                //finally begins
        input.next();
    }                                       //finally ends
}                                           //populateDate() method ends

基本上,我无法弄清楚如何解决此异常。该项目的实际目标是在网格中显示数据,但我只注意到在输出中发现了异常。代码编译得很好,所以我不担心分号放错位置或数据类型不正确。我是 Java 语言的新手,虽然书籍和其他 stackoverflow 问题已经解决了我的一些问题,但这个异常让我陷入困境。

是否有人能够就我需要做什么来解决输出中出现的异常、导致异常的原因提供一些反馈,或者至少引导我朝着正确的方向前进?我真的很感激任何有用的评论。谢谢。

最佳答案

您的异常堆栈跟踪显示了问题所在:

at inputOutput.ReadDataFile.populateData(ReadDataFile.java:50)

在第 50 行你有这个:

finally{                                //finally begins
    input.next();
}

问题是您已经用之前执行的循环耗尽了文件:

while(input.hasNext()){             //4. while loop goes through data file

    data.add(input.next());         //a. data from file added to ArrayList
}

关于使用 Scanner.next() 时出现 java.util.NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949475/

相关文章:

java - Java可以在错误日志中输出变量名和数据值吗?

java - Do-While 循环中的异常线程

java - Imageiio 无法创建图像输入流

Java:模式在扫描仪中的行为不同

java - 如何解析java源代码而不存储空行?

Java Time(4,129) 应给出 6 小时 9 分钟

java - Spring Batch - 使用带有列表列表的 ItemWriter

java - hibernate 外键问题: Error executing DDL "alter table..."

Java重构异常处理最佳实践

java - 无法证明 -100000000000000 适合作为长输入