在Java的try-catch-finally中,什么时候应该使用finally块?

14

什么时候应该使用代码片段A而不是片段B(即使用片段A的好处是什么)?:

代码片段A:

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

代码片段 B:

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

//codeblock C

1
相关:https://dev59.com/OnA75IYBdhLWcg3wVXav - wkl
5个回答

15

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

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


这也是一个好的实践,因为它明确说明了正在发生的事情,例如,无论执行情况如何,我们都必须释放资源x等。 - Tony
注意,在Java 7中,您可以使用try-with-resources语句来关闭某些资源,因此在这种情况下您不需要使用finally - dogbane
1
@duffymo 但是在 片段 B 中的 codeblock C 不也会处理这个吗? - poplitea
2
如果有人在catch块中添加了return语句,则无法保证其正确性。 - duffymo

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

1

如果您需要进行一些清理工作,例如关闭数据库连接,那么使用“finally”非常有用。由于“finally”始终被执行,因此您无需在“try”结尾和一个或多个“catch”块中进行容易出错的复制粘贴相同代码。


1
当您拥有需要在成功或错误场景下进行清理的资源时,几乎总是要使用带有finally块的代码片段。一个典型的例子是jdbc连接对象,它应该始终在finally块中关闭(清理)。

0
假设在 catch 块中有一个 return 语句:在代码片段B中,C块将不会被执行,但在代码片段A中,在返回之前将被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接