最后怎么用

Mar*_*ijn 37 java try-catch-finally

我从来没有正确理解finally语句的用法.谁能告诉我两者之间的区别是什么:

try {
    a;
    block;
    off;
    statements;
} catch (Exception e) {
    handle;
    exception;
    e;
} finally {
    do;
    some;
    cleanup;
}
Run Code Online (Sandbox Code Playgroud)

一方面和:

try {
    a;
    block;
    off;
    statements;
} catch (Exception e) {
    handle;
    exception;
    e;
}
do;
some;
cleanup;
Run Code Online (Sandbox Code Playgroud)

在另一

mer*_*ike 36

他们有所不同

  • try-块抛出一个完成java.lang.Throwable这不是一个java.lang.Exception,例如,因为它是一个java.lang.ErrorAssertionErrorOutOfMemoryError.
  • try-block使用控制流语句突然完成,例如continue,breakreturn
  • catch-block突然完成(通过抛出任何throwable,或使用控制流语句)

更一般地说,java语言保证在try语句完成之前执行finally块.(请注意,如果在try语句没有完成,也没有对最后的保证,语句可能无法完成的原因有多种,包括硬件关机,关闭操作系统,虚拟机停机(例如因System.exit),线程等待(Thread.suspend(),synchronized,Object.wait(),Thread.sleep())或以其他方式被忙碌(无端环,,,,).

因此,一个finally块是比方法体的结束清理工作一个更好的地方,但其本身,仍然不能保证清理exeuction.


YoK*_*YoK 29

finally 块始终执行.

finallyblock用于清理,比如释放try/中使用的资源catch,关闭数据库连接,关闭套接字等等.即使在try/ catchblock中发生未处理的异常时也是如此.

finally块不执行的唯一时间system.exit()是调用try/ catch或发生某些错误而不是异常.

上述描述中的错误意味着Java应用程序退出时出现Out of Memory错误.我看到一些downvotes :(因为这个原因似乎.

  • 更正:抛出java.lang.Error时执行finally块_is_.它可能无法成功执行,但它确实执行.此外,还有其他条件可能会阻止finally块的执行,请参阅我对不完整列表的回答. (2认同)

Dan*_*Dan 18

主要区别在于该catch部分本身可能抛出异常,突破周围的块,或从当前方法返回.在那种情况下do; some; cleanup;不执行.

使用finally块,可以保证将执行该代码.

  • ...或者死锁,或者...... - 真正的规则是:当try-(catch)-finally语句完成时,保证finally/block被执行. (2认同)

Jon*_*eet 11

捕获所有异常基本上是个坏主意 - 所以你需要考虑如果未捕获的异常从try/catch或try/catch/finally块传播出来会发生什么.最后一块可以让你清理出去.

也:

  • catch块可能会抛出异常
  • 您可能想要从try块返回

简而言之,如果您希望在离开try/catch块时执行某些代码,但是您要离开它(除了过程非常难以终止),最后是您的朋友.


Jon*_*ark 9

在正确的编码风格中,您不希望如下所示进行捕获.

try{
  [some task] 
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)

您想要做的是捕获特定的已知错误.

try{
  [some task] 
}
catch(Exception ex)
{
   if([known execption])
     [ignore]
   else
     throw(ex);
}
[Cleanup]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果再次抛出错误,则不会运行清理代码.因此,即使抛出新错误,我们也会在finally中添加即将运行的内容.

try{
  [some task] 
}
catch(Exception ex)
{
   if([known execption])
     [ignore]
   else
     throw(ex);
}
finally
{
   [Cleanup]
}
Run Code Online (Sandbox Code Playgroud)


ian*_*sme 7

"finally"块将始终执行.

在第二个示例中,如果catch块重新抛出异常,或者try块中发生未捕获的异常,则不会进行清理.