3

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

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

对不起,如果这是一个愚蠢或幼稚的问题。我只是无法弄清楚使用该finally语句的好处。

4

6 回答 6

10

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

于 2012-06-17T14:00:01.673 回答
4

catch 语句不会总是运行。finally 语句保证运行。例如:如果您需要关闭流。

于 2012-06-17T13:59:10.720 回答
2

finally无论是否抛出异常,都会执行分支。仅当catchtry块中引发指定的异常时,才会执行分支。

finally当您想确保在块的 and 处正确释放资源(例如关闭打开的文件)时,通常会使用try,无论是否try完全成功 - 这不仅可以确保块中的代码finally如果try块成功或任何catch分支被执行,但也当抛出未在块中列出的catch异常时(例如未经检查的异常或运行时错误) ,则执行

于 2012-06-17T14:05:01.117 回答
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
}
于 2012-06-17T14:06:11.917 回答
1

finally 块总是被执行,无论是否发生异常。而 catch 块只有在发生或抛出可捕获的异常时才会执行。

如果异常的类与 catch 语句中的定义匹配(其中之一),则异常是“可捕获的”。例如:

catch(AnException ex | AnOtherException ex2) {}

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

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

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

于 2012-06-17T14:10:52.430 回答
0

Try是针对Catch(Exception e)的特定异常并执行finally语句。

于 2012-06-17T14:01:05.677 回答