最后怎么用

时间:2010-07-28 16:00:09

标签: java try-catch-finally

我从未正确理解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;

另一方

9 个答案:

答案 0 :(得分:36)

如果

,它们会有所不同
  • try - 块通过抛出非java.lang.Throwable的{​​{1}}来完成,例如因为它是java.lang.Exception,例如java.lang.Error或{ {1}}。
  • try-block使用控制流语句突然完成,例如AssertionErrorOutOfMemoryErrorcontinue
  • catch-block突然完成(通过抛出任何throwable,或使用控制流语句)

更一般地说,java语言保证在try语句完成之前执行finally块。 (请注意,如果try-statement没有完成,则无法保证finally。语句可能由于各种原因而无法完成,包括硬件关闭,操作系统关闭,VM关闭(例如由于break ),线程等待(returnSystem.exitThread.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块传播出来会发生什么。最后,积木允许你在出路时清理。

此外:

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

简而言之,如果您希望在离开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)。