我对Java
相对较新,我仍在努力了解基本面。我一直在以try-catch
语句的形式学习异常处理。这些很好,我理解我应该如何以及为什么要使用它们。困扰我的是try-finally
语句。
更具体地说,我不明白为什么我不能只使用catch
语句来做同样的事情。选择将一些命令放在finally
语句中而不是在catch
语句中放置相同的语句有什么好处?这些陈述不会以完全相同的方式执行吗?
对不起,如果这是一个愚蠢或天真的问题。我只是无法理解使用finally
语句的好处。
答案 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) {}
只会捕获AnException
或AnOtherException
类型的异常(请注意它是JSE7错字)。
我建议你阅读关于try-catch-finally statement
执行顺序的JSL,它包含所有细节。
请注意,finally
通常用于释放资源(即使用close()
方法),因为JDK7可以使用try-with-ressource statement自动为您关闭资源,它适用于实现AutoCloseable的类。
答案 5 :(得分:0)
尝试用于 Catch(例外e)特定异常,并执行 finally 语句。