Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
当 try 块退出时,finally 块 总是 执行。这确保即使发生意外异常也会执行 finally 块。但 finally 不仅仅是对异常处理有用 它允许程序员避免通过 return,continue 或 break 意外绕过清理代码。将清理代码放在 finally 块中总是一种很好的做法,即使没有预期的异常情况也是如此。
try 或 catch 代码时 JVM 退出,则 finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或终止,即使整个应用程序继续,finally 块也可能无法执行。
你在此处使用的 writeList 方法的 try 块将打开 PrintWriter。程序应该在退出 writeList 方法之前关闭该流。这造成了一个有点复杂的问题,因为 writeList 的 try 块可以以三种方式之一退出。
new FileWriter 语句失败并抛出 IOException。list.get(i) 语句失败并抛出 IndexOutOfBoundsException。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 部分包含更多信息。