AutoCloseable并引发异常

时间:2018-06-29 06:49:47

标签: java try-with-resources method-invocation autocloseable

AutoCloseable具有方法“ void close throws Exception”。 一些建议扩展此接口并覆盖close方法并删除Exception。例如,请参见下面的链接。

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

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

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

示例位置:

3 个答案:

答案 0 :(得分:1)

  

AutoCloseable具有方法“ void close throws Exception”。一些建议扩展此接口并覆盖close方法并删除Exception。

您发布的链接并不表示一般情况下,它向您显示了io包为什么有自己的Closeable界面,而该界面只抛出IOException(因为它没有不需要抛出更一般的Exception。)这在运行时的差异为零,它完全是适当的,因此如果在尝试抛出 not IOException异常时抛出了编译器错误使用io.Closeable界面。

  

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

您似乎暗示这里没有任何链接-AutoCloseable可能抛出的异常类型实际上与关闭包装的资源无关。

  

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

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

  

在流api中,关闭称为

除非您将其包装在带有资源块的try中,否则不会。

  

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  

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