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

Vis*_*ant 7 java try-catch try-with-resources

我在读这个环节try-with-resources,它说:

Closeable接口的close方法抛出类型的异常,IOExceptionAutoCloseable接口的close方法抛出类型的异常Exception.

但为什么?AutoCloseable可能还抛出的close方法IOException是有任何支持AutoCloseable必须抛出类型异常的close方法的例子Exception

Ren*_*ink 14

AutoClosable接口位于java.lang并且旨在应用于需要"自动"关闭的任何资源(尝试使用资源).在AutoClosable不能是一个IO相关型号资源.因此接口不能对具体异常做出任何假设.

另一方面Closable,位于java.io和扩展AutoClosable,因为a ClosableAutoClosableio资源.因此它声明IOException可以抛出s.

例如...... a java.sql.ConnectionAutoClosable因为它是close方法抛出SQLException而a SQLException不是a IOException.在内存DB中考虑一下,关闭一个sql连接一定不能抛出IOException.

编辑

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

我认为它位于,java.lang因为try-with-resources是作为Java 1.7中的语言特性引入的.从而java.lang

  • `AutoClosable 不能是与 io 相关的资源。`这是不正确的,可以通过将“must”更改为“may”来纠正。 (2认同)

ROM*_*eer 6

Closeable扩展AutoCloseable,但可能有其他特定的接口扩展此接口.例如:

public interface MyCloseable extends AutoCloseable { 
    void close() throws RuntimeException; 
}
Run Code Online (Sandbox Code Playgroud)

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


Ole*_*yar 5

除了能够抛出一些其他类型的异常外IOException,还可以轻松地监督一个美丽而常见的用例:

一个人可以重写该接口以使它根本没有throws声明,从而允许try在不进行显式异常处理的情况下进行编写。

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

public interface Searcher<V> extends AutoCloseable {

    Stream<V> search();

    @Override
    void close();
}
Run Code Online (Sandbox Code Playgroud)

这允许以下Searcher实例的使用:

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

如果在上没有throws声明AutoCloseable,则上述方法将是唯一的用法,因为它将无法覆盖AutoCloseable抛出未在父对象上声明的异常的接口。当前完成的方式,两种选择都是可能的。