首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么引入Autocloseable而不是扩展Closeable中可能的异常

为什么引入Autocloseable而不是扩展Closeable中可能的异常
EN

Stack Overflow用户
提问于 2015-06-11 23:06:17
回答 2查看 505关注 0票数 4

他们为什么要添加AutoCloseable并按如下方式更改Closeable

代码语言:javascript
复制
public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

而不是像下面这样更改Closeable (不添加AutoCloseable):

代码语言:javascript
复制
public interface Closeable {
    public void close() throws Exception;
}

第二种解决方案的优点是: 1)生成的异常没有限制(请参阅IOException) 2) Closeable本身可以在不扩展AutoCloseable的情况下在try-with-resources中使用3)这不会破坏现有代码,因为实现只能具有比接口中定义的异常更有限的异常4)不会过度设计

为什么他们决定采用第一种解决方案而不是第二种呢?

EN

回答 2

Stack Overflow用户

发布于 2015-06-11 23:41:54

您不能简单地更改已经发布的方法的检查异常列表。否则,较旧的代码可能会损坏。例如,在Java 7之前可能存在这样的方法:

代码语言:javascript
复制
public void closeAll(Collection<Closeable> collection) {
    for(Closeable closeable : collection) {
        try {
            closeable.close();
        }
        catch(IOException ex) {
            // ignore
        }
    }
}

在您提出的更改之后,此代码将无法编译。Java设计人员非常重视向后兼容性问题。

票数 6
EN

Stack Overflow用户

发布于 2018-03-07 14:40:09

回答得好@Tagir Valeev。

Closeable在system.io包中,正如Tagir所说,Closeable.close抛出IOException -假设它与I/O相关。AutoCloseable在java.lang中,AutoCloseable.close抛出异常。

有了经验,封闭性被发现是一种更普遍的东西,而不仅仅是特定于I/O。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30784596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档