0

我写了一个函数来扫描一个制表符分隔的棒球统计文件。

public static ArrayList dataRead() throws FileNotFoundException {
    //ArrayList array = new ArrayList<ArrayList>();
    Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r");

    ArrayList<String> array = new ArrayList<String>();
    int i = 0;
    while(s.next() != null) {
        String currentLine = s.next();
        Scanner split = new Scanner(currentLine).useDelimiter("\t");
        for(int j = 0; j < 16; j++) {
            System.out.print(split.next() + " ");

            j++;

        }
        System.out.println("\r");
    }
    s.close();
    return array;
}

此功能一直有效,直到文件结束。据我所知,while 循环应该在文件末尾关闭,因为它返回 null,但我不断收到 noSuchElement 错误。如果我能保证文件大小,我会使用一个带有大小的 for 循环,但我不能,因为团队规模在技术上可能会有所不同。如何在循环时正确结束文件扫描仪以便关闭扫描仪?

4

5 回答 5

2

来自:Scanner.next() 的 Javadocs

抛出:NoSuchElementException - 如果没有更多的令牌可用

当文件中没有更多行时,调用s.next()会引发NoSuchElementException异常。您还调用s.next()了两次,一次在 while() 中,一次在循环内。你真的应该被召唤while(s.hasNext())

于 2012-04-09T04:44:52.623 回答
2

不是在循环条件中使用scanner.next()usescanner.hasNext()来检查是否有新元素

于 2012-04-09T04:47:11.157 回答
0

for 循环有两个问题:

  1. 为什么j < 16?如果一行中的标记少于 16 个,那么这将是一个错误。请考虑使用带有split.hasNext()条件的 while 循环,类似于外部 while 循环。

  2. 索引变量j增加了两次——一次在 for 循环的声明中,再一次在同一个 for 循环的主体中。

需要更正外部 while 循环以使用hasNext()而不是next() != null.

于 2012-04-09T04:46:09.223 回答
0

做就是了:

while(s.hasNext())
{
    //blah
}

也使用 aStringTokenizer而不是 afor loop的标记。

StringTokenizer str = new StringTokenizer(currentLine,"\t");
while(str.hasMoreTokens)
{
    System.out.print(str.nextToken());
}
于 2012-04-09T04:46:11.483 回答
0

您可以在 while 条件下使用 s.hasNext() 。如果下一个令牌存在,它将返回 true,否则返回 false。

while(s.hasNext()){
}
于 2012-04-09T04:50:44.357 回答