You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中finally代码块执行机制:为何运行时错误前先执行finally?

Java运行时异常与finally代码块执行顺序解析

当你输入错误内容(比如非数字字符串)时,触发的是Double.parseDouble抛出的NumberFormatException,这个异常并没有被你代码中的catch (MyException ex)块捕获,所以会按以下流程执行:

  1. try块执行到Double.parseDouble(kb.nextLine())时抛出NumberFormatException,try块立即终止后续执行;
  2. Java会优先执行finally代码块——这是语言规范强制要求的,目的是保证收尾逻辑(比如资源释放、状态清理)一定会被执行,所以你会先看到foo:finally的输出;
  3. finally块执行完成后,这个未被捕获的NumberFormatException才会被JVM向上抛出,最终打印出运行时错误信息。

补充两个和你代码相关的场景:

  • 输入负数触发MyException时,异常会被catch块捕获,先执行System.out.println("Cath:foo");,再执行finally块;
  • 输入0触发YourException时,因为没有对应的catch块,同样会先执行finally块,再抛出运行时错误。

你的测试代码如下:

public class main {
  public static void main(String[] args) {

    try {
        Scanner kb = new Scanner(System.in);

        System.out.println("enter number:");
        double val = Double.parseDouble(kb.nextLine());
        double result = MathUtil.myLog(val);
    }
    catch (MyException ex) {
        System.out.println("Cath:foo");
    }
    finally {
        System.out.println("foo:finally");
    }
}

class MathUtil {
  public static double myLog(double val) {
    if (val < 0)
        throw new MyException();

    if(val == 0)
        throw new YourException();

    return Math.log(val);
}
class MyException extends RuntimeException {

}

class YourException extends RuntimeException {

}

内容的提问来源于stack exchange,提问作者bigci1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:55:24