【问题标题】:When should I use the finally-block in Java's try-catch-finally我什么时候应该在 Java try-catch-finally 中使用 finally-block
【发布时间】:2011-09-13 17:07:00
【问题描述】:

我什么时候应该使用代码 sn-p A 而不是 sn-p B(即使用 sn-p A 有什么好处)?:

片段 A:

try {
    // codeblock A
}
catch (Exception ex) {
    // codeblock B
}
finally {
    //codeblock C
}

片段 B:

try {
    // codeblock A
}
catch (Exception ex) {
    // codeblock B
}

//codeblock C

【问题讨论】:

标签: java exception-handling


【解决方案1】:

如果您的代码必须执行,无论是否引发异常,请使用 finally 块。

清理数据库连接等稀缺资源就是一个很好的例子。

【讨论】:

  • 这也是一种很好的做法,因为它明确说明了正在发生的事情,例如无论执行如何,我们都必须释放资源 x 等。
  • 注意,在 Java 7 中,您可以使用 try-with-resources 语句来关闭某些资源,因此在这种情况下您不需要 finally
  • @duffymo 但是 sn-p B 中的codeblock C 不会也解决这个问题吗?
  • 不保证是否有人在 catch 块中返回。
【解决方案2】:

一个明显的情况是当您在 catch 块中重新引发或抛出另一个异常时。

【讨论】:

    【解决方案3】:

    如果您需要进行一些清理,这很有用,例如关闭数据库连接。因为“finally”总是被执行,所以您不需要在“try”的末尾以及一个或多个“catch”块中对相同的代码进行容易出错的复制粘贴。

    【讨论】:

      【解决方案4】:

      当您拥有需要在成功或错误情况下清理的资源时,您几乎必须始终使用带有 finally 块的 sn-p。一个典型的例子是在 finally 块中应该始终关闭(清理)的 jdbc 连接对象。

      【讨论】:

        【解决方案5】:

        想象在catch 块内有一个return 语句:C 块不会在 sn-p B 中执行,而是在 sn-p A它会在返回之前。

        【讨论】:

          猜你喜欢
          • 2013-05-18
          • 2010-11-12
          • 1970-01-01
          • 2011-10-31
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-09-05
          • 2014-11-27
          相关资源
          最近更新 更多