文档

Java™教程
隐藏目录
finally块
路径: Java基础类
课程: 异常
章节: 捕获和处理异常

finally块

finally块在try块退出时总是执行。这确保了即使发生意外异常,finally块也会被执行。但是finally不仅仅在异常处理中有用,它还允许程序员避免清理代码被returncontinuebreak绕过。将清理代码放在finally块中始终是一个好的做法,即使没有预期的异常。


注意: 如果在执行try块或catch代码时JVM退出,finally块可能不会被执行。

writeList方法的try块打开了一个PrintWriter。程序应该在退出writeList方法之前关闭该流。这会带来一个稍微复杂的问题,因为writeListtry块可能有三种方式退出。

  1. new FileWriter语句失败并抛出IOException
  2. list.get(i)语句失败并抛出IndexOutOfBoundsException
  3. 一切顺利,try块正常退出。

无论在try块中发生了什么,运行时系统总是执行finally块中的语句。因此,它是执行清理操作的完美位置。

下面是writeList方法的finally块清理和关闭PrintWriterFileWriter的示例。

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语句清理和关闭PrintWriterFileWriter
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语句

上一页: catch 块
下一页: try-with-resources 语句