在Java';让我们最后试着接球

在Java';让我们最后试着接球,java,exception-handling,Java,Exception Handling,什么时候应该使用代码段A而不是代码段B(即使用代码段A的好处是什么) 片段A: try { // codeblock A } catch (Exception ex) { // codeblock B } finally { //codeblock C } try { // codeblock A } catch (Exception ex) { // codeblock B } //codeblock C 片段B: try { // cod

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

片段A:

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

//codeblock C
片段B:

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

//codeblock C

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


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

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

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

当您在成功或错误场景中都有需要清理的资源时,几乎必须始终将代码段与finally块一起使用。一个典型的例子是jdbc连接对象,它应该在finally块中始终关闭(清理)。

想象一下在
catch
块中有一个
return
语句:C块不会在snippetB中执行,但在snippetA中会执行,返回之前。

Related:这也是一种良好的做法,因为它明确说明了正在发生的事情,例如,无论执行如何,我们都必须释放资源x等。注意,在Java 7中,您可以使用try with resources语句关闭某些资源,因此,在这种情况下,您不需要一个
finally
。@duffymo但代码段B中的
代码块C
也会处理这个问题吗?如果有人在catch块中输入了返回,则不保证。