繁体   English   中英

AutoCloseable并引发异常

[英]AutoCloseable and throws exception

AutoCloseable具有“无效关闭引发异常”方法。 一些建议扩展此接口并覆盖close方法并删除Exception。 例如,请参见下面的链接。

但是,当我忘记将语句放在try-with-resources语句中时,close方法比未调用吗?

  • 在try-with-resources中,关闭称为
  • 在流api中,关闭称为
  • 例如,当离开创建资源的方法时,由Java自动执行???

我在互联网上搜索并查看了文档的其他信息 两者都建议删除throws Exception语句。 但是我对此建议的反应是,将来将来我们项目中的某个人实现新接口(无例外)而忘记将它们放在“尝试使用资源”中时,会导致资源泄漏。 对于我们的项目来说,这不是一个大问题,因为我们正在使用SonarQube,它将提到资源泄漏

位置示例:

AutoCloseable具有“无效关闭引发异常”方法。 一些建议扩展此接口并覆盖close方法并删除Exception。

您发布的链接并不建议作为一般情况,它向您展示io包为何具有自己的Closeable接口,该接口仅引发IOException (因为它不需要引发更一般的Exception 。)这使零差在运行时,它完全就位,因此,如果在使用io.Closeable接口时有任何尝试抛出不是 IOException的异常,则会引发编译器错误。

但是,当我忘记将语句放在try-with-resources语句中时,close方法比未调用吗?

您似乎暗示这里没有任何链接-当关闭其包装的资源时, AutoCloseable可能引发的异常类型与无关。

在try-with-resources中,关闭称为

是的,这是语言功能的重点。

在流api中,关闭称为

除非您将其包装在try资源块中,否则不要这样做。

例如,当离开创建资源的方法时,由Java自动执行???

不,如果您忘记关闭资源,它将保持打开状态。

(此规则的唯一例外是,如果资源在终结器中关闭自身,终结器将在垃圾回收之前执行。这当然不是要依赖的东西,只是(有时)用作备用。)

当资源超出范围时,try-with-resources自动调用close (也:您只能在try-with-resources中声明一个AutoClosable )。 如果您忘记将资源放入该语言结构中,则必须手动关闭它。

AutoCloseable.close()方法不是析构函数(Java中没有析构函数)-它是专门为try-with-resources创建的,因此如果未在该语句中使用,则不会调用-请参见文档

退出在资源规范头中已声明该对象的try-with-resources块时,将自动调用AutoCloseable对象的close()方法。 这种构造可确保及时释放,避免资源耗尽异常和可能发生的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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