在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。
Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。
所以为了确保一定能回收 try 块中打开的物理资源,异常处理机制提供了 finally 代码块,并且 Java 7 之后提供了自动资源管理(Automatic Resource Management)技术。
finally 语句可以与前面介绍的 try catch 语句块匹配使用,语法格式如下:
try { // 可能会发生异常的语句 } catch(ExceptionType e) { // 处理异常语句 } finally { // 清理代码块 }
对于以上格式,无论是否发生异常(除特殊情况外),finally 语句块中的代码都会被执行。此外,finally 语句也可以和 try 语句匹配使用,其语法格式如下:
try { // 逻辑代码块 } finally { // 清理代码块 }
使用 try-catch-finally 语句时需注意以下几点:
一般情况下,无论是否有异常拋出,都会执行 finally 语句块中的语句,执行流程如图 1 所示。