finally 块
finally
块始终在try
块退出时执行。这样可以确保即使发生意外异常也要执行finally
块。但是finally
不仅对异常处理有用,它还使程序员避免return
,continue
或break
意外跳过清理代码。将清除代码放在finally
块中始终是一个好习惯,即使没有 exception 的情况也是如此。
Note:
如果在执行try
或catch
代码时退出 JVM,则finally
块可能不会执行。同样,如果执行try
或catch
代码的线程被中断或杀死,即使整个应用程序 continue 运行,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");
}
}
Important:
finally
块是防止资源泄漏的关键工具。关闭文件或以其他方式恢复资源时,请将代码放在finally
块中,以确保始终恢复资源。
考虑在这些情况下使用try-
with-resources 语句,该语句会在不再需要时自动释放系统资源。 try-with-resources 语句部分具有更多信息。