Vis*_*ant 7 java try-catch try-with-resources
我在读这个环节的try-with-resources,它说:
Closeable接口的close方法抛出类型的异常,IOException而AutoCloseable接口的close方法抛出类型的异常Exception.
但为什么?AutoCloseable可能还抛出的close方法IOException是有任何支持AutoCloseable必须抛出类型异常的close方法的例子Exception
Ren*_*ink 14
该AutoClosable接口位于java.lang并且旨在应用于需要"自动"关闭的任何资源(尝试使用资源).在AutoClosable不能是一个IO相关型号资源.因此接口不能对具体异常做出任何假设.
另一方面Closable,位于java.io和扩展AutoClosable,因为a Closable是AutoClosableio资源.因此它声明IOException可以抛出s.
例如...... a java.sql.Connection是AutoClosable因为它是close方法抛出SQLException而a SQLException不是a IOException.在内存DB中考虑一下,关闭一个sql连接一定不能抛出IOException.
编辑
回答了一个疑问,即为什么AutoClosable保存在java.lang包下.谢谢.
我认为它位于,java.lang因为try-with-resources是作为Java 1.7中的语言特性引入的.从而java.lang
Closeable扩展AutoCloseable,但可能有其他特定的接口扩展此接口.例如:
public interface MyCloseable extends AutoCloseable {
void close() throws RuntimeException;
}
Run Code Online (Sandbox Code Playgroud)
他们希望有一个可以在很多情况下使用的接口,这就是他们决定使用的Exception原因,因为它也适用于其他类型的异常.
除了能够抛出一些其他类型的异常外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抛出未在父对象上声明的异常的接口。当前完成的方式,两种选择都是可能的。
| 归档时间: |
|
| 查看次数: |
7748 次 |
| 最近记录: |