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语句。