[英]AutoCloseable and throws exception
AutoCloseable具有“无效关闭引发异常”方法。 一些建议扩展此接口并覆盖close方法并删除Exception。 例如,请参见下面的链接。
但是,当我忘记将语句放在try-with-resources语句中时,close方法比未调用吗?
我在互联网上搜索并查看了文档的其他信息 。 两者都建议删除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.