异常处理中“finally”子句的好处

时间:2013-12-13 16:49:23

标签: java exception exception-handling try-catch-finally finally

作为这方面的新手,在异常处理中使用finally子句有什么好处。或者换句话说,当最好使用它时,最好不要使用它。

我能想到的唯一一个是关闭输入/输出流......任何其他好处??? !!

5 个答案:

答案 0 :(得分:5)

finally 非常在需要释放某些资源的情况下非常有用。

例如:

InputStream is = null;
try {
    is = new FileInputStream("C://test.txt");
    //some reading-file logic 
} catch (Exception e) {
    //exception handling
} finally {
    //releasing the resources (closing the input stream)
    if (is != null) {
        is.close();
    }
}

答案 1 :(得分:2)

对于任何完成所有任务时要执行的任务,finally块都很有用。在最后的任务中,我指的是任何一个下面的内容。释放资源,关闭流,完成任何操作的结束任务等。

正如我们所知,finally块总是在任何异常之后执行。所以finally块中的操作是gurranteed。所以这些是最终应该完成的任务。

答案 2 :(得分:1)

你已经想过一个很好的例子。关闭I / O流,或者更一般地,释放/释放您之前打开/创建的任何类型的资源。

另一个示例可能是终止您可能已创建的进程/线程。

更重要的是,您可以向客户端组件发送事件/通知。

答案 3 :(得分:1)

无论StinePike编写的是完美的,但我想在其中添加一些东西。

最后执行块是发生异常还是不执行....所以我们可以通过在try块中写入finally块代码并在catch块()中实现这一点而不用最终块。现在如果没有发生异常,它会从try块执行代码。如果发生异常,它会执行catch块中的代码。

所以finally块的另一个优点是你可以在方法的任何地方写return语句,最后仍然执行块但如果你不在finally块中编写代码并从方法返回则不执行代码(在某些条件的基础上),在达到该代码之前。

答案 4 :(得分:1)

finally有用的另一种情况是确保释放“手动”锁(使用语言的同步结构实现的锁在内部使用finally来实现此目的)。但是,在执行此操作时,有一个细节有时会被忽略:锁定通常是为了允许代码暂时违反对象的不变量并在其他人注意之前重新建立它们。如果发生异常将使对象的不变量处于不正确的状态,则正确的行为通常不是保持锁定,而是确保设置变量以指示已发生,并让任何获取锁定的人检查此如果设置了变量并抛出异常。

如果在lock对象中封装了lock-is-valid变量,代码可能如下所示:

void insertItem(...)
{
  try
  {
    myLock.acquire();
    myLock.enterDanger();
    ...
    myLock.leaveDanger();
  }
  finally
  {
    myLock.release();
  }
}

从不修改受保护对象但只是简单地读取它的代码永远不必“enterDanger”。如果在锁定仍处于release状态时调用danger,则可能希望捕获当前堆栈跟踪;对myLock.acquire的待处理或将来的调用应抛出异常,可能包括该堆栈跟踪作为补充信息。

请注意,可以尝试在myLock块中使catch无效,但必须确保没有人向catch块添加try块来处理预期的异常而不会使锁无效。如果在意外的位置发生预期的异常,则受保护的对象可能会处于损坏状态而不会触发应该使其失效的catch(更具体的捕获的执行将阻止执行更少特定​​的异常一个)。