如何在java中正确定义未定长度的循环时结束文件扫描程序

时间:2012-04-09 04:36:29

标签: java

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

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循环,但我不能,因为团队规模在技术上可能会有所不同。如何在循环时正确结束文件扫描程序,以便关闭扫描仪?

5 个答案:

答案 0 :(得分:2)

来自:Javadocs for Scanner.next()

  

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

如果文件中没有剩余行,则调用s.next()会引发NoSuchElementException异常。你也在调用s.next()两次,一次调用while(),一次调用循环。你应该真的被称为while(s.hasNext())

答案 1 :(得分:2)

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

答案 2 :(得分:0)

for循环有两个问题:

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

  2. 索引变量j增加两次 - 在for循环的声明中增加一次,并再次成为for循环的主体。

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

答案 3 :(得分:0)

只是做:

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

同时使用StringTokenizer而不是for loop作为令牌。

StringTokenizer str = new StringTokenizer(currentLine,"\t");
while(str.hasMoreTokens)
{
    System.out.print(str.nextToken());
}

答案 4 :(得分:0)

你可以在while条件下使用s.hasNext()。如果存在下一个标记,则返回true,否则返回false。

while(s.hasNext()){
}