java错误或功能 - 为什么这不会引发异常

时间:2016-08-29 17:23:30

标签: java exception

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

它会按预期抛出异常。

这对我没有任何意义。任何见解都将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果没有剩余的令牌,

hasNext()可以在文件结尾之前返回false。当文件末尾只留下分隔符时就是这种情况。

将此与hasNextLine()进行比较。如果您正在使用nextLine(),则条件应为hasNextLine()hasNext()next()一起使用。

答案 1 :(得分:0)

1stly hasNext() - 如果此扫描器的输入中有另一个标记,则返回true。在等待输入扫描时,此方法可能会阻塞。扫描仪不会超过任何输入。但是在while循环的情况下,我们总是会成功。

在nextLine()的情况下2 - 将此扫描器推进到当前行并返回跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。 由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可以缓冲搜索要跳过的行的所有输入。

所以,在while(true)的情况下,我们总是变为真,并且在某个时刻,nextLine()方法找不到行分隔符,因此给出异常,但是在while(hasNext())方法的情况下,它返回false在文件中没有令牌,所以循环中断所以没有Exception来.. 希望这可以帮助你。