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 部分包含更多信息。