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
吗?请解释为什么会这样。
答案 0 :(得分:1)
您似乎误解了Scanner
的文档。如果没有更多令牌,next()
会抛出NoSuchElementException
;当底层流在其结束或已经关闭时就是这种情况。如果扫描仪本身已关闭,它只会抛出IllegalStateException
- 这在您的问题中不会发生。