![](/img/trans.png)
[英]java.io.Closeable: why throwing RuntimeException in close() works?
[英]Why close method of java.lang.AutoCloseable throws Exception, but close method of java.io.Closeable throws IOException?
我正在阅读此链接以try-with-resources
,它说:
Closeable
接口的close方法抛出IOException
类型的异常,而AutoCloseable
接口的close方法抛出异常类型的Exception
。
但为什么? AutoCloseable
的close方法也可能抛出IOException
是否有任何支持AutoCloseable
close方法必须抛出Exception
类型的Exception
例子
AutoClosable
接口位于java.lang
,旨在应用于需要“自动”关闭的任何资源( 尝试使用资源 )。 AutoClosable
不能是io相关资源。 因此接口不能对具体异常做出任何假设。
另一方面, Closable
位于java.io
并扩展了AutoClosable
,因为Closable
是io资源的AutoClosable
。 因此,它声明可以在关闭时抛出IOException
。
例如...... java.sql.Connection
是AutoClosable
因为它的close方法抛出SQLException
而SQLException
不是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;
}
他们希望有一个可以在很多情况下使用的接口,这就是为什么他们决定使用Exception
因为它也适用于其他类型的异常。
除了能够抛出一些其他类型的异常而不是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
如果AutoCloseable
上没有throws
声明,则上述将是唯一的用法,因为无法覆盖AutoCloseable
接口抛出未在父级上声明的异常。 目前的方式,两种选择都是可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.