文档

Java™ 教程-Java Tutorials 中文版
finally 块
Trail: Essential Classes
Lesson: Exceptions
Section: Catching and Handling Exceptions

finally 块

try 块退出时,finally总是 执行。这确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅是对异常处理有用 — 它允许程序员避免通过 returncontinuebreak 意外绕过清理代码。将清理代码放在 finally 块中总是一种很好的做法,即使没有预期的异常情况也是如此。


注意: 如果在执行 trycatch 代码时 JVM 退出,则 finally 块可能不会执行。同样,如果执行 trycatch 代码的线程被中断或终止,即使整个应用程序继续,finally 块也可能无法执行。

你在此处使用的 writeList 方法的 try 块将打开 PrintWriter。程序应该在退出 writeList 方法之前关闭该流。这造成了一个有点复杂的问题,因为 writeListtry 块可以以三种方式之一退出。

  1. new FileWriter 语句失败并抛出 IOException
  2. list.get(i) 语句失败并抛出 IndexOutOfBoundsException
  3. 一切都成功,try 块正常退出。

无论 try 块中发生了什么,运行时系统总是执行 finally 块中的语句。所以这是进行清理的最佳地点。

writeList 方法的以下 finally 块清除然后关闭 PrintWriter

finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
} 

重要: finally 块是防止资源泄漏的关键工具。关闭文件或以其他方式恢复资源时,将代码放在 finally 块中,以确保资源 总是 恢复。

在这些情况下,请考虑使用 try-with-resources 语句,这会在不再需要时自动释放系统资源。The try-with-resources Statement 部分包含更多信息。

Previous page: The catch Blocks
Next page: The try-with-resources Statement