考虑以下java代码,它打开一个文件,读取所有数据,然后尝试再读一行。
public static void main ( String[] argv) {
FileInputStream inFile = null;
try {
inFile = new FileInputStream("DemoRead.txt");
}
catch ( FileNotFoundException ex) {
System.out.println("Could not open file "+ ex.getMessage());
System.exit(0);
}
Scanner inputStream = new Scanner( inFile);
while ( inputStream.hasNext()) {
System.out.println( inputStream.nextLine());
}
System.out.println(inputStream.nextLine());
inputStream.close();
}
我希望最后的inputStream.nextLine()会抛出一个异常,因为没有别的东西可以读。
确实,如果我将while循环更改为:
while ( true) {
System.out.println ( inputStream.nextLine());
}
它会按预期抛出异常。
这对我没有任何意义。任何见解都将不胜感激。
答案 0 :(得分:2)
hasNext()
可以在文件结尾之前返回false。当文件末尾只留下分隔符时就是这种情况。
将此与hasNextLine()
进行比较。如果您正在使用nextLine()
,则条件应为hasNextLine()
。 hasNext()
与next()
一起使用。
答案 1 :(得分:0)
1stly hasNext() - 如果此扫描器的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。但是在while循环的情况下,我们总是会成功。
在nextLine()的情况下2 - 将此扫描器推进到当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。 由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可以缓冲搜索要跳过的行的所有输入。
所以,在while(true)的情况下,我们总是变为真,并且在某个时刻,nextLine()方法找不到行分隔符,因此给出异常,但是在while(hasNext())方法的情况下,它返回false在文件中没有令牌,所以循环中断所以没有Exception来.. 希望这可以帮助你。