finally 块

finally块始终在try块退出时执行。这样可以确保即使发生意外异常也要执行finally块。但是finally不仅对异常处理有用,它还使程序员避免returncontinuebreak意外跳过清理代码。将清除代码放在finally块中始终是一个好习惯,即使没有 exception 的情况也是如此。

Note:

如果在执行trycatch代码时退出 JVM,则finally块可能不会执行。同样,如果执行trycatch代码的线程被中断或杀死,即使整个应用程序 continue 运行,finally块也可能不会执行。

您在此处使用的writeList方法的try块将打开PrintWriter。程序应在退出writeList方法之前关闭该流。由于writeListtry块可以通过以下三种方式之一退出,因此这带来了一些复杂的问题。

  • 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 语句部分具有更多信息。