为什么 java.lang.AutoCloseable 的 close 方法会抛出异常,而 java.io.closeable 的 close 方法会抛出 IOException?

2022-09-03 17:36:47

我正在阅读此链接,它说:try-with-resources

接口的 close 方法引发类型的异常,而接口的 close 方法引发类型的异常。CloseableIOExceptionAutoCloseableException

但是为什么?关闭方法也可以抛出是否有任何示例支持该关闭方法必须抛出类型的异常AutoCloseableIOExceptionAutoCloseableException


答案 1

该接口位于中,旨在应用于需要“自动”关闭的任何资源(尝试使用资源)。不得是 io 已释放的资源。因此,接口不能对具体异常做出任何假设。AutoClosablejava.langAutoClosable

另一方面位于 并扩展,因为 a 是 io 资源。因此,它声明 s 可以抛出关闭。Closablejava.ioAutoClosableClosableAutoClosableIOException

例如。。。a 是一个,因为它是接近方法抛出,a 不是 .想想在内存数据库中,关闭sql连接一定不能抛出.java.sql.ConnectionAutoClosableSQLExceptionSQLExceptionIOExceptionIOException

编辑

回答了另一个问题,即为什么AutoClosable保留在java.lang包下。谢谢。

我认为它之所以位于 中,是因为 try-with-resources 是作为 Java 1.7 中的一种语言特性引入的。因此java.langjava.lang


答案 2

此外,除了一个漂亮而常见的用例之外,还能够抛出一些其他类型的异常,这可以很容易地监督:IOException

可以重写接口以完全没有声明,从而允许在没有显式异常处理的情况下编写。throwstry

在我们的代码中,我们有一个按以下方式声明的接口Searcher

public interface Searcher<V> extends AutoCloseable {

    Stream<V> search();

    @Override
    void close();
}

这允许以下实例使用:Searcher

try (Searcher<Datatype> dataTypeSearcher = new DataTypeSearcher(query)) {
    return dataTypeSearcher.search();
}
// without any catch statements

如果 上不存在任何声明,则上述用法是唯一的用法,因为不可能覆盖接口,从而引发未在父项上声明的异常。按照目前的方式,两种选择都是可能的。throwsAutoCloseableAutoCloseable


推荐