我有一个类打印机:
import java.io.File;
import java.util.Scanner;
public class Printer {
private File file;
public Printer(String fileName) throws Exception {
this.file = new File(fileName);
}
public void foo(String word) throws Exception {
Scanner reader = new Scanner(this.file, "UTF-8");
while (reader.hasNextLine()) {
String line = reader.nextLine();
if (word.isEmpty()) {
//System.out.println(reader.nextLine());
System.out.println(line);
}
}
reader.close();
}
}
上面的代码运行正常。但是,当我取消注释System.out.println(reader.nextLine());
并注释掉System.out.println(line);
时,为什么会抛出NoSuchElementException?
答案 0 :(得分:2)
我在这里看不太多,这让我感到惊讶。最有可能的是,第一次调用while
时,Scanner#nextLine()
循环就会触及文件末尾。然后,您进行第二次调用,抛出异常,因为没有更多内容可供阅读。
while (reader.hasNextLine()) {
// during the last iteration, this next call consumes the final line
String line = reader.nextLine();
if (word.isEmpty()) {
// but then you call nextLine() here again, causing the exception
//System.out.println(reader.nextLine());
System.out.println(line);
}
}
这里故事的寓意是不从Scanner
读取内容而不先检查内容是否存在。通过评论上面的这一行,你删除了问题,但你应该理解为什么你评论它可能是好的。
答案 1 :(得分:1)
这是因为您在每次循环迭代中读取了两行,但是如果有下一行则只检查一次。因此,如果文件具有奇数行,则当没有导致异常的下一行时,您将调用nextLine
。