我从未正确理解finally语句的使用。任何人都可以告诉我之间的区别:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
} finally {
do;
some;
cleanup;
}
一方面:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
}
do;
some;
cleanup;
另一方
答案 0 :(得分:36)
如果
,它们会有所不同try
- 块通过抛出非java.lang.Throwable
的{{1}}来完成,例如因为它是java.lang.Exception
,例如java.lang.Error
或{ {1}}。AssertionError
,OutOfMemoryError
或continue
更一般地说,java语言保证在try语句完成之前执行finally块。 (请注意,如果try-statement没有完成,则无法保证finally。语句可能由于各种原因而无法完成,包括硬件关闭,操作系统关闭,VM关闭(例如由于break
),线程等待(return
,System.exit
,Thread.suspend()
,synchronized
)或正在忙碌(无限循环,,,,)。
因此,Object.wait()
块是一个比方法体末端更好的清理操作的地方,但是它本身仍然无法保证清理执行。
答案 1 :(得分:29)
finally
块始终执行。
finally
块用于清理,比如释放try
/ catch
中使用的资源,关闭数据库连接,关闭套接字等等。即使在您的内部发生未处理的异常时也是如此try
/ catch
阻止。
finally
块未执行的唯一时间是system.exit()
/ try
中调用catch
或发生某些错误而不是异常。
上述说明中的错误表示Java应用程序退出时出现内存不足等错误。我看到一些downvotes :(因为这个原因似乎。
答案 2 :(得分:18)
主要区别在于catch
部分本身可能会抛出异常,突破周围的块,或从当前方法返回。在这种情况下,do; some; cleanup;
不会被执行。
使用finally
块,保证该代码将被执行。
答案 3 :(得分:11)
捕获所有异常基本上是个坏主意 - 所以你需要考虑如果未捕获的异常从try / catch或try / catch / finally块传播出来会发生什么。最后,积木允许你在出路时清理。
此外:
简而言之,如果您希望在离开try / catch块时执行某些代码,那么就会离开它(除了进程被非常困难地终止),最后是你的朋友
答案 4 :(得分:8)
在正确的编码风格中,您不希望如下所示进行捕捉。
try{
[some task]
}
catch
{
}
您想要做的是捕获特定的已知错误。
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
[Cleanup]
在这种情况下,如果再次抛出错误,则不会运行清理代码。所以我们添加了finally,即使抛出新的错误也会运行。
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
finally
{
[Cleanup]
}
答案 5 :(得分:7)
“finally”块将始终执行。
在第二个示例中,如果catch块重新抛出异常,或者try块中发生未捕获的异常,则不会进行清理。
答案 6 :(得分:3)
来自GeekInterview的this论坛:
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中始终是一种很好的做法,即使没有预期的例外情况也是如此。
答案 7 :(得分:1)
只需一行解释:
无论您是否捕获到异常,finally
块中的代码都将被执行。
你在这里给出的两件作品之间的差异是:不使用finally
的作品中的代码永远不会被执行。
要正确理解finally
,您需要知道的是finally
=保证!
您可以使用它来清理,帮助用户友好或重试某些内容
答案 8 :(得分:0)
在第一个示例中,即使在try子句中有return语句,也始终会执行finally块。它没有被执行的唯一时间是你有System.exit(0)。