14

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

接口的 close 方法Closeable抛出 type 的异常,IOException而接口的 close 方法AutoCloseable抛出 type 的异常Exception

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

4

3 回答 3

14

AutoClosable接口位于java.lang并旨在应用于任何需要“自动”关闭的资源(try-with-resources)。AutoClosable不能是与 io 相关的资源。所以接口不能对具体的异常做任何假设。

另一方面Closable是位于java.io并extends AutoClosable,因为aClosable是一个AutoClosablefor io 资源。因此它声明IOExceptions 可以关闭。

例如... ajava.sql.Connection是 anAutoClosable因为它是 close 方法 throwsSQLException而 aSQLException不是 a IOException。想想内存数据库,关闭 sql 连接不能抛出IOException.

编辑

又回答了一个疑问,即为什么 AutoClosable 保存在 java.lang 包下。谢谢。

我认为它位于java.lang因为try-with-resources是作为 Java 1.7 中的语言功能引入的。因此java.lang

于 2014-09-21T13:45:43.227 回答
10

除了能够抛出一些其他类型的异常之外IOException,还可以轻松监督一个漂亮且常见的用例:

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

在我们的代码中,我们有一个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

如果throws在 上没有声明AutoCloseable,则上述将是唯一的用法,因为无法覆盖AutoCloseable引发未在父级上声明的异常的接口。就目前的做法而言,这两种选择都是可能的。

于 2018-03-27T14:16:14.387 回答
8

Closeableextends AutoCloseable,但可能有其他特定接口扩展此接口。例如:

public interface MyCloseable extends AutoCloseable { 
    void close() throws RuntimeException; 
}

他们希望有一个可以在许多情况下使用的接口,这就是他们决定使用的Exception原因,因为它也适用于其他类型的异常。

于 2014-09-21T13:49:22.907 回答