为什么 InputStream.close() 被声明为抛出 IOException?
java.io.InputStream.close()
方法被声明为抛出一个 .在什么情况下会实际引发这样的异常?IOException
编辑:是的,我已经阅读了javadoc。有谁能比“当发生I / O错误时”更具体吗?什么关闭 ?InputStream
java.io.InputStream.close()
方法被声明为抛出一个 .在什么情况下会实际引发这样的异常?IOException
编辑:是的,我已经阅读了javadoc。有谁能比“当发生I / O错误时”更具体吗?什么关闭 ?InputStream
在从文件系统读取输入流的情况下,当文件系统本身在关闭期间更新文件的上次访问时间元数据或其他一些元数据时,可能会引发错误。无论如何,这在实践中几乎从未发生过。
在从网络连接读取输入流的情况下,闭包时的错误更容易想象。网络套接字的正常关闭实际上涉及通过连接发送的关闭请求(TCP / IP FIN数据包)并等待另一端确认此关闭请求。(实际上,连接的另一端依次发送关闭请求,关闭端确认该请求。因此,在套接字输入流的情况下,闭包操作实际上涉及通过连接发送流量,因此闭包可能会失败并出现错误。
请注意,在许多实现中,如果流已经关闭,通常不会抛出;它只是静默地失败以再次关闭流。close()
IOException
我正在查看Java源代码,并发现了一些有趣的东西,这表明了原因。 是一个抽象类。因此,我们无法预测将被关闭的输入类型,因此保持信息流动是件好事。IOException
InputStream
无论使用哪个代码,输入流都需要能够抛出 一个 ,因为关闭输入流可能会失败。如果它失败了,无论使用什么实现都需要知道它,因为很有可能需要处理它。IOException
了解 Java 中异常结构的布局非常重要。当然,每个例外都会扩展。但是,还有更广泛的例外类别:是其中之一,并涵盖所有可能的输入/输出异常。当我们说存在 I/O 错误时,我们引用的是 属于 的任何内容。因此,许多例外扩展了这一个,例如 ,等,因为有一个广泛的、总体的例外来管理这些异常非常重要。Exception
java.lang.IOException
IOException
FileNotFoundException
EOFException
因此,任何 IO 类都需要能够在关闭时抛出任何各种 IOException。 因此必须抛出 - 这使其实现能够抛出任何扩展。这就是抛出的原因 - 异常是继承的,并且在关闭流时需要能够使用任何IOExceptions。close()
IOException
IOException
close()
IOException
以下是几个值得注意的场景:
close()
IOException
FileNotFoundException
)您可以通过运行 来检查导致 的原因。IOException
Exception.getMessage()