java.util.NoSuchElementException:找不到行

时间:2012-12-12 01:20:21

标签: java file exception file-io java.util.scanner

信息:

当我执行我的程序时,一个简单的文件阅读器,我得到一个例外。

我的文件保存在.java文件旁边。

输出:

  

运行:
  姓名:Koen
  得分:44
  线程“main”java.util.NoSuchElementException中的异常:找不到行   姓名:Kevin
  得分:55
    在java.util.Scanner.nextLine(Scanner.java:1585)
    at tetris.FileIO.loadHighscores(FileIO.java:41)
    在tetris.FileIO.getLineScores(FileIO.java:28)
    在tetris.FileIO.main(FileIO.java:62)
  Java结果:1
  建立成功(总时间:0秒)

代码:

package tetris;

import java.io.File;
import java.io.InputStream;
import java.io.Writer;
import java.util.Scanner;

public class FileIO   {
    private File file;
    private Scanner filescScanner, lineScanner;
    private Writer fileWriter, lineWriter;
    private String[][] data;

    public FileIO () {
        String[][] data = new String[100][1];
    }
    public String[][] getLineScores(){
        return this.loadHighscores(this.getClass().getResourceAsStream("LineHighscores.txt"));
    }
    public String[][] getTimeScores(){
        return this.loadHighscores(this.getClass().getResourceAsStream("TimeHighscores.txt"));
    }

    public String[][] loadHighscores( InputStream resourceStream){

        int x=0;
        String test = "";

        filescScanner = new Scanner(resourceStream);

        while((test=filescScanner.nextLine())!=null) {

            lineScanner = new Scanner(test);
            lineScanner.useDelimiter("-/-");
            System.out.println("name : "+lineScanner.next());
            System.out.println("score : " +lineScanner.next());

            x++;
        }
        lineScanner.close();
        filescScanner.close();
        return data;    
    }

    public static void main(String[] args){
        FileIO file = new FileIO();
        System.out.println(file.getLineScores());
    }
}

2 个答案:

答案 0 :(得分:4)

当您调用nextLine()时:

 while((test=filescScanner.nextLine())!=null)

投掷exception表示扫描仪没有更多输入线。因此,它永远不会返回null。

请尝试使用hasNextLine()检查是否有下一行。

while(filescScanner.hasNextLine())
{
    test=filescScanner.nextline();
    ...
}

hasNextLine

public boolean hasNextLine()

  

返回:当且仅当此扫描器具有另一行输入(source

时才返回true

因此,当扫描仪无法再阅读任何输入行时,hasNextLine()将返回false。因此,终止循环。

答案 1 :(得分:0)

如果我理解正确的话,你希望while循环终止,当文件中没有更多的行可以读取时。 Scanner类实现了一个hasNextLine方法,当有一行要读取时返回true,否则返回false。我认为你可以用scanner.hasNextLine()替换while条件,这将解决在第41行引发的NoElementException。我希望你觉得这个答案很有帮助。

祝你好运 尼古拉