AutoCloseable具有方法“ void close throws Exception”。 一些建议扩展此接口并覆盖close方法并删除Exception。例如,请参见下面的链接。
但是当我忘记将语句放在try-with-resources语句中时,close方法比未调用吗?
其他信息 我在互联网上搜索并查看了文档。两者都建议删除throws Exception语句。但是我对此建议的反应是,将来将来我们项目中的某个人实现新接口(无例外)而忘记将它们放在“尝试使用资源”中时,会导致资源泄漏。对于我们的项目来说,这不是一个大问题,因为我们正在使用SonarQube,它将提到资源泄漏
示例位置:
答案 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()方法。这种构造可确保及时释放,避免资源耗尽异常和可能发生的错误。