为什么会选择使用finally语句而不是catch语句? (JAVA)

时间:2012-06-17 13:57:23

标签: java exception-handling try-catch try-catch-finally

我对Java相对较新,我仍在努力了解基本面。我一直在以try-catch语句的形式学习异常处理。这些很好,我理解我应该如何以及为什么要使用它们。困扰我的是try-finally语句。

更具体地说,我不明白为什么我不能只使用catch语句来做同样的事情。选择将一些命令放在finally语句中而不是在catch语句中放置相同的语句有什么好处?这些陈述不会以完全相同的方式执行吗?

对不起,如果这是一个愚蠢或天真的问题。我只是无法理解使用finally语句的好处。

6 个答案:

答案 0 :(得分:10)

catch:出现问题时。
finally:什么/什么都没有出错 就像你想要关闭数据库连接而不管是否抛出异常一样,在这种情况下,finally将是放置代码的最佳位置。
此外,如果您有多个具有冗余代码的catch块,则可以将冗余部分移动到finally块。

答案 1 :(得分:4)

catch语句不会一直运行。 finally语句保证运行。例如:如果你需要关闭一个流。

答案 2 :(得分:2)

无论是否抛出异常,都会执行finally分支。只有在catch块中抛出指定的异常时,才会执行try分支。

当你想要确保资源在finally块和try块处被正确释放(例如打开文件已关闭)时,通常会使用try,无论{{1}完全成功与否 - 这不仅可以确保finally块中的代码块在try块成功或执行任何catch分支时执行,而且还可以当抛出catch块中未列出的异常时(例如未经检查的异常或运行时错误)

答案 3 :(得分:2)

try {
    //...
} catch(SomeException ex) {
    //code to execute if exception occurs
} finally {
    //code to execute no matter whether the exception occured or not
    //usually you put code to close resources here so that in any condition the
    //resources are released back to the system
}

答案 4 :(得分:1)

如果发生异常,则始终执行finally块 。而只有在可捕获异常发生或被抛出时才会执行catch块

如果它的类匹配(一个)catch语句中的定义,则异常是“ catchable ”。例如:

catch(AnException ex | AnOtherException ex2) {}

只会捕获AnExceptionAnOtherException 类型的异常(请注意它是JSE7错字)

我建议你阅读关于try-catch-finally statement执行顺序的JSL,它包含所有细节。

请注意,finally通常用于释放资源(即使用close()方法),因为JDK7可以使用try-with-ressource statement自动为您关闭资源,它适用于实现AutoCloseable的类。

答案 5 :(得分:0)

尝试用于 Catch(例外e)特定异常,并执行 finally 语句。