Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化了解Java SE 9及后续版本中更新的语言特性的概要。
请参阅JDK发行说明了解所有JDK发行版本中的新功能、增强功能以及已删除或已弃用选项的信息。
finally
块在try
块退出时总是执行。这确保了即使发生意外异常,finally
块也会被执行。但是finally
不仅仅在异常处理中有用,它还允许程序员避免清理代码被return
、continue
或break
绕过。将清理代码放在finally
块中始终是一个好的做法,即使没有预期的异常。
try
块或catch
代码时JVM退出,finally
块可能不会被执行。
writeList
方法的try
块打开了一个PrintWriter
。程序应该在退出writeList
方法之前关闭该流。这会带来一个稍微复杂的问题,因为writeList
的try
块可能有三种方式退出。
new FileWriter
语句失败并抛出IOException
。list.get(i)
语句失败并抛出IndexOutOfBoundsException
。try
块正常退出。无论在try
块中发生了什么,运行时系统总是执行finally
块中的语句。因此,它是执行清理操作的完美位置。
下面是writeList
方法的finally
块清理和关闭PrintWriter
和FileWriter
的示例。
finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } if (f != null) { System.out.println("Closing FileWriter"); f.close(); } }
try-with-resources
语句而不是finally
块。下面的示例使用try-with-resources
语句清理和关闭PrintWriter
和FileWriter
:
public void writeList() throws IOException { try (FileWriter f = new FileWriter("OutFile.txt"); PrintWriter out = new PrintWriter(f)) { for (int i = 0; i < SIZE; i++) { out.println("Value at: " + i + " = " + list.get(i)); } } }
try-with-resources
语句会自动释放资源。详见try-with-resources语句。