在由闭合流初始化的Scanner上调用next()不会抛出IllegalStateException

时间:2015-09-03 06:20:25

标签: java java.util.scanner java-api system.in

Scanner documentation表示当一个人在封闭的流上调用next()时,可能会抛出这两个异常:

  

NoSuchElementException - 如果没有更多令牌可用

     

IllegalStateException - 如果此扫描程序已关闭

此外hasNext()可能会抛出此异常:

  

IllegalStateException - 如果此扫描程序已关闭

现在让我们假设我们有这个代码:

FileInputStream fis = new FileInputStream(new File("somefile"));
Scanner sc = new Scanner(fis);
// sc.close();
// sc = new Scanner(fis);
// somefile contents: word1 word2 word3
System.out.println(sc.next());

这将按预期打印word1。如果我们取消注释sc.close(); sc = new Scanner(fis);,则会在NoSuchElementException执行时抛出sc.next()

这种行为对我来说很奇怪。当hasNext()关闭时,next()IllegalStateException不应抛出InputStream吗?请解释为什么会这样。

1 个答案:

答案 0 :(得分:1)

您似乎误解了Scanner的文档。如果没有更多令牌,next()会抛出NoSuchElementException;当底层流在其结束或已经关闭时就是这种情况。如果扫描仪本身已关闭,它只会抛出IllegalStateException - 这在您的问题中不会发生。