我写了一个函数来扫描一个以制表符分隔的棒球统计数据文件。
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循环,但我不能,因为团队规模在技术上可能会有所不同。如何在循环时正确结束文件扫描程序,以便关闭扫描仪?
答案 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循环有两个问题:
为什么j < 16
?如果一行中少于16个令牌,那么这将是一个错误。请考虑使用具有split.hasNext()
条件的while循环,类似于外部while循环。
索引变量j
增加两次 - 在for循环的声明中增加一次,并再次成为for循环的主体。
需要更正外部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()){
}