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

use*_*212 4 java interface exception java-7

他们为什么添加AutoCloseable和更改Closeable如下:

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}
Run Code Online (Sandbox Code Playgroud)

而不是仅Closeable进行如下更改(不添加AutoCloseable):

public interface Closeable {
    public void close() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

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

是否有任何理由为什么他们决定采用第一个解决方案而不是第二个解决方案?

Tag*_*eev 5

您根本无法更改已发布方法的已检查异常列表。否则,较旧的代码可能会损坏。例如,这种方法可能在Java 7之前存在:

public void closeAll(Collection<Closeable> collection) {
    for(Closeable closeable : collection) {
        try {
            closeable.close();
        }
        catch(IOException ex) {
            // ignore
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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