最后如何使用
我从来没有正确理解最后声明的使用。 谁能告诉我之间的区别是什么:
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;
在另一
他们不同,如果
-
try
block通过抛出一个不是java.lang.Exception
,例如,因为它是一个java.lang.Error
比如AssertionError
或OutOfMemoryError
。 - try-block使用控制stream语句(例如
continue
,break
或return
突然完成 - catch-block突然完成(通过抛出任何throwable或使用控制stream语句)
更一般地说,java语言保证在try-statement完成之前执行finally块。 (请注意,如果try语句没有完成,那么就不能保证finally语句可能由于各种原因而无法完成,包括硬件closures,OSclosures,VMclosures(例如由于System.exit
),线程正在等待( Thread.suspend()
, synchronized
, Object.wait()
, Thread.sleep()
),否则忙(无限循环,,,,)。
所以, finally
一块是比方法体的末尾更好的清理行为,但是本身并不能保证清理的效果。
finally
总是阻止执行。
finally
块用于清理,就像释放try
/ catch
使用的资源,closures数据库连接,closures套接字等等,即使try
/ catch
块中发生了未处理的exception。
finally
块不执行的唯一时间是在try
/ catch
调用system.exit()
,或者发生一些错误而不是exception。
上面的描述中的错误意味着当Java应用程序退出时出现Out Of Memory错误等情况。 我看到一些downvotes :(因为这个原因,似乎。
主要区别是catch
部分本身可能会抛出一个exception,突破周围的块,或者从当前的方法返回。 在这种情况下do; some; cleanup;
do; some; cleanup;
没有执行。
使用finally
块,可以保证代码将被执行。
捕获所有的exception基本上是一个坏主意 – 所以你需要考虑如果一个未捕获的exception从你的try / catch或者try / catch / finally块中传播出去会发生什么。 最后块可以让你清理出路。
也:
- catch块可能会抛出exception
- 你可能想从try块返回
简而言之,如果你想在离开try / catch块的时候执行一些代码, 但是你要离开它(除了进程被非常困难地终止之外),最后是你的朋友。
“finally”块将始终执行。
在第二个示例中,如果catch块重新抛出exception,或者try块中发生未捕获的exception,则不会发生清理。
在适当的编码风格,你不想做一个捕获所有如下。
try{ [some task] } catch { }
你想要做的是捕获特定的已知错误。
try{ [some task] } catch(Exception ex) { if([known execption]) [ignore] else throw(ex); } [Cleanup]
在这种情况下,您的清理代码将不会在再次抛出错误的情况下运行。 所以我们在最后添加即使抛出一个新的错误也会运行。
try{ [some task] } catch(Exception ex) { if([known execption]) [ignore] else throw(ex); } finally { [Cleanup] }
从GeekInterview上的这个论坛:
finally块总是在try块退出时执行。 这确保即使发生意外的exception也能执行finally块。 但是最后对于不仅仅是exception处理而言是有用的 – 它允许程序员避免由于返回,继续或中断而意外绕过清除代码。 清理代码放在finally块里总是一个很好的习惯,即使没有预期的例外。
只需一行解释:
无论你是否遇到exception, finally
块中的代码都会被执行。
你在这里给出的两个部分之间的差异是:没有finally
使用的片段中的代码将永远不会被执行。
finally
才能正确理解,所有你需要知道的是finally
=保证!
你可以使用它来清理,以帮助用户友好或重试
在第一个例子中,即使在try子句中有return语句,finally块也总是被执行。 唯一没有执行的时候是你有System.exit(0)的时候。