java Bug或特性——为什么不抛出异常?



考虑下面的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());
}

按预期抛出异常。

这对我来说没有任何意义。

hasNext()可以在文件结束之前返回false,如果没有更多的令牌剩余。当文件末尾只剩下分隔符时,就会出现这种情况。

hasNextLine()比较。如果你使用nextLine(),那么条件应该是hasNextLine()hasNext()next()配合使用

1stly hasNext()——如果此扫描器的输入中有另一个令牌,则返回true。此方法可能会在等待输入扫描时阻塞。扫描器不会超过任何输入。但是对于while循环,我们总是得到true。

在nextLine()的情况下,

第二——将此扫描器推进到当前行之后,并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置被设置为下一行的开头。由于此方法继续在输入中搜索以寻找行分隔符,因此如果没有行分隔符存在,它可能会缓冲所有搜索要跳过的行的输入。

所以,在while(true)的情况下,我们总是得到true,在某些情况下,nextLine()方法没有找到行分隔符,所以给出异常,但是在while(hasNext())方法的情况下,当文件中没有令牌时,它返回false,所以循环中断,所以没有异常。

相关内容

最新更新