47

我从来没有正确理解 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;

在另一

4

9 回答 9

39

它们不同,如​​果

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

更一般地说,Java 语言保证在 try 语句完成之前执行 finally 块。(请注意,如果 try 语句没有完成,则不能保证 finally。一个语句可能由于各种原因而无法完成,包括硬件关闭、操作系统关闭、VM 关闭(例如由于System.exit)、线程等待( Thread.suspend(), synchronized, Object.wait(), Thread.sleep()) 或其他忙(无休止的循环,,,,)。

所以,一个finally块是一个比方法体结尾更好的清理动作的地方,但它本身仍然不能保证清理的执行。

于 2010-07-31T21:46:04.020 回答
31

finally块总是执行。

finally块用于清理,例如释放try/中使用的资源,关闭数据库连接,关闭套接字等。即使/块中catch发生未处理的异常。trycatch

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

上述描述中的错误是指 Java 应用程序退出时出现 Out Of Memory 错误等情况。我看到一些反对票:(出于这个原因似乎。

于 2010-07-28T16:02:19.923 回答
21

主要区别在于该catch部分本身可能会引发异常、跳出周围的块或从当前方法返回。在这种情况下do; some; cleanup;不执行。

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

于 2010-07-28T16:02:21.687 回答
13

捕获所有异常基本上是一个坏主意 - 因此您需要考虑如果未捕获的异常从您的 try/catch 或 try/catch/finally 块中传播出去会发生什么。finally 块允许您在退出时进行清理。

还:

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

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

于 2010-07-28T16:02:53.220 回答
9

在正确的编码风格中,您不想像下面那样做一件事。

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]
}
于 2010-07-28T16:01:15.137 回答
8

“finally”块将始终执行。

在您的第二个示例中,如果 catch 块重新引发异常,或者在 try 块中发生未捕获的异常,则不会发生清理。

于 2010-07-28T16:03:10.997 回答
3

来自GeekInterview 的这个论坛:

finally 块总是在 try 块退出时执行。这样可以确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅对异常处理有用——它允许程序员避免清理代码意外地被 return、continue 或 break 绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

于 2010-07-28T16:03:42.627 回答
0

简单的一行解释:

不管你是否捕捉到异常,finally块中的代码都会被执行。

您在此处给出的两部分之间的区别是:未使用的部分中的代码finally将永远不会被执行。

要正确理解finally,您只需要知道finally= 保证!

您可以使用它来清理、帮助用户友好或重试某些事情

于 2010-07-28T16:52:54.950 回答
0

在第一个示例中,即使在 try 子句中有 return 语句,finally 块也总是会执行。它唯一没有被执行的是当你有 System.exit(0) 时。

于 2010-07-28T17:48:38.450 回答