题目
try-catch-finally 执行顺序与 finally 块的作用
信息
- 类型:问答
- 难度:⭐
考点
异常处理流程,finally块特性,执行顺序
快速回答
当代码执行流程如下:
- 先执行 try 块中的代码
- 若 try 块抛出异常,则进入匹配的 catch 块
- 无论是否发生异常或 return,finally 块始终执行
示例代码输出:
- Try block
- Catch block: Exception thrown
- Finally block
原理说明
Java 异常处理的核心机制:try 定义可能抛出异常的代码块,catch 捕获并处理特定异常,finally 块用于执行必须运行的清理代码(如资源释放)。关键特性:finally 块在任何情况下(包括 return、break 或异常)都会执行。
代码示例与执行分析
public class ExceptionDemo {
public static void main(String[] args) {
try {
System.out.println("Try block");
throw new RuntimeException("Exception thrown"); // 1. 抛出异常
} catch (RuntimeException e) {
System.out.println("Catch block: " + e.getMessage()); // 2. 捕获处理
return; // 3. 尝试退出方法
} finally {
System.out.println("Finally block"); // 4. 始终执行
}
}
}输出结果:
Try block
Catch block: Exception thrown
Finally block关键机制
- finally 的强制性:即使 catch 块中有 return,JVM 也会先执行 finally 再返回
- 执行顺序:try → catch(若异常)→ finally
- 资源清理:finally 最适合关闭文件、数据库连接等资源
最佳实践
- 始终在 finally 中释放资源(JDK7+ 可使用 try-with-resources)
- 避免在 finally 中使用 return(会覆盖 try/catch 的返回值)
- 保持 finally 块简洁,仅包含必要清理代码
常见错误
- 错误:认为 catch 中的 return 会跳过 finally
- 错误:在 finally 中抛出异常(会掩盖原始异常)
- 错误:用 catch(Exception e) 捕获所有异常却不处理
扩展知识
- Checked vs Unchecked 异常:示例中 RuntimeException 是 unchecked 异常,无需显式声明
- try-with-resources:自动关闭资源,优于 finally 手动关闭
- 异常链:可通过
e.addSuppressed()保留原始异常信息