0

AutoCloseable 有一个方法'void close throws Exception'。有人建议扩展此接口并覆盖 close 方法并删除异常。例如,请参见下面的链接。

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

  • 在 try-with-resources 中调用 close
  • 在流 api 中调用 close
  • 例如,在离开创建资源的方法时由 java 自动执行???

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

示例位置:

4

3 回答 3

1

AutoCloseable 有一个方法'void close throws Exception'。有人建议扩展此接口并覆盖 close 方法并删除异常。

您发布的链接并不意味着作为一般情况,它向您展示了为什么io包有自己的Closeable接口,只抛出一个IOException(因为它不需要抛出一个更一般的Exception。)这在运行时产生零差异,它是完全到位,因此如果在使用接口时有任何东西试图抛出不是IOException的东西,则会抛出编译器错误。io.Closeable

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

您似乎在这里暗示了一个没有链接的链接-AutoCloseable当它包装的资源关闭时,可能抛出的异常类型实际上与它无关。

在 try-with-resources 中调用 close

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

在流 api 中调用 close

除非您将其包装在 try with resources 块中。

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

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

(此规则的唯一例外是资源在终结器中关闭自身,该终结器在垃圾收集之前执行。但这当然不是可以依赖的东西,它只是(有时)用作后备。)

于 2018-06-29T06:59:54.600 回答
0

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

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

于 2018-06-29T06:59:02.683 回答
0

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

于 2018-06-29T06:57:43.110 回答