繁体   English   中英

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

[英]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.ConnectionAutoClosable因为它的close方法抛出SQLExceptionSQLException不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM