最后如何使用

我从来没有正确理解最后声明的使用。 谁能告诉我之间的区别是什么:

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比如AssertionErrorOutOfMemoryError
  • try-block使用控制stream语句(例如continuebreakreturn突然完成
  • catch-block突然完成(通过抛出任何throwable或使用控制stream语句)

更一般地说,java语言保证在try-statement完成之前执行finally块。 (请注意,如果try语句没有完成,那么就不能保证finally语句可能由于各种原因而无法完成,包括硬件closures,OSclosures,VMclosures(例如由于System.exit ),线程正在等待( Thread.suspend()synchronizedObject.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)的时候。