【问题标题】:AutoCloseable and throws exceptionAutoCloseable 并抛出异常
【发布时间】:2018-12-08 07:15:30
【问题描述】:

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

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

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

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

示例位置:

【问题讨论】:

  • 当我忘记将语句放在 try-with-resources 语句中时,是不是调用 close 方法? - 无论您是否覆盖 @987654322,这都是一样的@ 与否 -
  • 第三个要点。 Java什么都不做。您必须以某种方式调用close 方法。即使只是将其放入 try-with-resources 或使用流

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      AutoCloseable 有一个方法“void close throws Exception”。有人建议扩展这个接口,重写close方法,去掉Exception。

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

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

      您似乎在暗示一个没有链接的链接 - AutoCloseable 可能抛出的异常类型与它包装的资源关闭时没有任何关系。

      在 try-with-resources 中调用 close

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

      在流 api 中调用关闭

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多