AutoCloseable.close() 方法是不是破坏了 Java 的向后兼容规则

Posted

技术标签:

【中文标题】AutoCloseable.close() 方法是不是破坏了 Java 的向后兼容规则【英文标题】:Does AutoCloseable.close() method break Backward compatibilty rule of JavaAutoCloseable.close() 方法是否破坏了 Java 的向后兼容规则 【发布时间】:2014-08-07 19:11:30 【问题描述】:

从 Java 7 开始,Closeable 接口已被改造以扩展 AutoCloseable 接口,以便所有实现 Closeable 接口的类都可以使用 try-with-resources 语句。到目前为止,Closeable 接口可以随意抛出任何异常,包括 InterrruptedException。 但是,对于 Java 7,在退出 try 块后自动调用 close 方法时,try-with-resources 语句中使用的 Closeable 接口的任何实例都可能抛出 InterruptedException,并且其 InterruptedException 可能会被隐式调用 Throwable.addSuppressed(InterruptedException); 抑制

考虑到有人可能会在不知不觉中抑制其异常并且程序没有按应有的方式运行,这是否违反了 Java 的向后兼容性规则

【问题讨论】:

Closeable 不能随意抛出 any 异常。它将IOException 声明为其可抛出对象。 【参考方案1】:

不,这不会破坏向后兼容性。 “try-with-resources”特性是 Java 7 中的新特性;旧代码无法调用它。任何依赖于捕获close 抛出的异常的旧代码仍将使用普通的“try-catch”块,并且不会抑制异常,因为它不会使用“try-with-resources”。由于抑制,这样的块将无法转换为“try-with-resources”,但它仍将按原样工作。

【讨论】:

以上是关于AutoCloseable.close() 方法是不是破坏了 Java 的向后兼容规则的主要内容,如果未能解决你的问题,请参考以下文章

Closeable 和 AutoCloseable close() 方法的执行顺序

Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

什么是静态方法?

init()方法和构造方法的区别

Java中的方法覆盖(Overriding)和方法重载(Overloading)是啥意思?

JAVA中有哪几种常用的排序方法?每个排序方法的实现思路是如何的?每个方法的思想是啥??