AutoCloseable有一个方法'void抛出异常‘。有些人建议扩展这个接口,覆盖close方法并删除异常。例如,请参见下面的链接。
但是当我忘记把这个语句放在一个“使用资源的尝试”语句中时,close方法是否比没有调用的方法更好呢?
附加信息我在互联网上搜索过,并查看了文档。两人都建议删除抛出异常语句。但是我对这个建议的反应是,将来当我们项目中的某个人实现新的接口(毫无例外)时,忘了把他们放到资源测试中,我们就有了资源泄漏。对于我们的项目来说,这不是一个大问题,因为我们使用的是SonarQube,它将提到资源泄漏
示例位置:
发布于 2018-06-29 06:59:54
AutoCloseable有一个方法'void抛出异常‘。有些人建议扩展这个接口,覆盖close方法并删除异常。
您发布的链接并不意味着作为一般情况,它向您展示了为什么io包有自己的Closeable接口,只抛出一个IOException (因为它不需要抛出一个更通用的Exception)。这在运行时没有任何区别,它完全是正确的,所以如果任何东西试图在使用IOException接口时抛出不是io.Closeable的东西,就会抛出编译器错误。
但是当我忘记把这个语句放在一个“使用资源的尝试”语句中时,close方法是否比没有调用的方法更好呢?
在这里,您似乎是在暗示一个没有链接的链接--当它包装的资源关闭时,AutoCloseable抛出的异常类型实际上与此无关。
在使用资源的尝试中,关闭被称为
是的,这就是语言特征的全部要点。
在流api中,close被称为
除非您用资源块将其包装在一个“尝试”中。
例如,如果离开创建资源的方法?
不,如果你忘了关闭一个资源,它就会一直开着。
(此规则的唯一例外是,如果资源关闭在终结器中,则在垃圾收集之前执行。这当然不是什么值得依赖的东西,它只是(有时)被用作退路。
发布于 2018-06-29 06:57:43
当资源超出作用域时,试用资源会自动调用close (同时:您只能在“使用资源”中声明AutoClosable )。如果忘记将资源放在该语言结构中,则必须手动关闭它。
发布于 2018-06-29 06:59:02
AutoCloseable.close()方法不是析构函数(在Java中没有析构函数)--它是专门为try-with-resources创建的,因此如果没有在该语句中使用,也不会调用它--请参阅文档
AutoCloseable对象的close()方法在退出在资源规范标头中声明对象的试用资源块时自动调用。此构造确保迅速发布,避免资源耗尽异常和其他可能发生的错误。
https://stackoverflow.com/questions/51095867
复制相似问题