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

Java中finally语句后的代码未打印,是否因异常导致?

问题解答:finally后代码未打印的原因

嘿,你猜的完全没错!那行System.out.println("end of a");没打印,确实是方法抛出的异常导致的,我给你掰扯清楚这里的执行逻辑:

核心原理:异常会中断finally后的执行流

在Java的try-catch-finally结构里,执行规则是这样的:

  • 如果try块抛出了异常,首先会去找匹配的catch块处理;
  • 不管catch有没有捕获到异常,finally块一定会执行;
  • 但如果异常没有被当前方法的catch块完全处理(比如catch没匹配到异常,或者catch里又抛出了新异常),那么finally执行完毕后,异常会继续向上层调用者抛出,这时候方法会直接终止,finally后面的代码根本没机会执行。

对应你场景的示例代码

比如你的方法核心逻辑大概是这样的:

public void a() {
    try {
        // 这里抛出了一个当前catch无法捕获的异常
        throw new IllegalArgumentException("参数错误");
    } catch (NullPointerException e) {
        // 这个catch抓不住上面的IllegalArgumentException
        e.printStackTrace();
    } finally {
        System.out.println("finally执行了");
    }
    // 这行代码永远到不了,因为异常在finally后继续抛出
    System.out.println("end of a");
}

当调用这个方法时,finally里的内容会正常打印,但"end of a"不会——因为未被捕获的异常会在finally执行完后立刻向上传递,方法提前结束了。

怎么让那行代码正常打印?

如果你想让"end of a"执行,有两个可行思路:

  • 确保catch块能捕获所有可能的异常,比如把catch改成捕获Exception,或者添加对应异常类型的catch块,并且不要在catch里抛出新异常;
  • 如果业务逻辑允许,把那行打印代码移到finally块里(要注意finally里的代码不管是否异常都会执行,得符合你的业务需求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:35:12