我正在阅读此链接,try-with-resources
它说:
接口的 close 方法
Closeable
抛出 type 的异常,IOException
而接口的 close 方法AutoCloseable
抛出 type 的异常Exception
。
但为什么?AutoCloseable
也可以抛出的关闭方法IOException
是否有任何支持AutoCloseable
必须抛出类型异常的关闭方法的示例Exception
我正在阅读此链接,try-with-resources
它说:
接口的 close 方法
Closeable
抛出 type 的异常,IOException
而接口的 close 方法AutoCloseable
抛出 type 的异常Exception
。
但为什么?AutoCloseable
也可以抛出的关闭方法IOException
是否有任何支持AutoCloseable
必须抛出类型异常的关闭方法的示例Exception
该AutoClosable
接口位于java.lang
并旨在应用于任何需要“自动”关闭的资源(try-with-resources)。AutoClosable
不能是与 io 相关的资源。所以接口不能对具体的异常做任何假设。
另一方面Closable
是位于java.io
并extends AutoClosable
,因为aClosable
是一个AutoClosable
for io 资源。因此它声明IOException
s 可以关闭。
例如... ajava.sql.Connection
是 anAutoClosable
因为它是 close 方法 throwsSQLException
而 aSQLException
不是 a IOException
。想想内存数据库,关闭 sql 连接不能抛出IOException
.
编辑
又回答了一个疑问,即为什么 AutoClosable 保存在 java.lang 包下。谢谢。
我认为它位于java.lang
因为try-with-resources是作为 Java 1.7 中的语言功能引入的。因此java.lang
除了能够抛出一些其他类型的异常之外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
引发未在父级上声明的异常的接口。就目前的做法而言,这两种选择都是可能的。
Closeable
extends AutoCloseable
,但可能有其他特定接口扩展此接口。例如:
public interface MyCloseable extends AutoCloseable {
void close() throws RuntimeException;
}
他们希望有一个可以在许多情况下使用的接口,这就是他们决定使用的Exception
原因,因为它也适用于其他类型的异常。