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

Java中finally块后续代码无法打印的技术咨询

问题解析与修复方案

首先来看你的测试代码:

class TestFinallyBlock1 { 
    public static void main(String args[]) { 
        try { 
            int data=25/0; 
            System.out.println(data); 
        } catch(NullPointerException e) { 
            System.out.println(e); 
        } finally { 
            System.out.println("finally block is always executed"); 
        } 
        System.out.println("rest of the code..."); 
    } 
}

为什么finally后的代码打印不出来?

核心原因是未被捕获的运行时异常导致JVM终止了主线程:

  • 代码里25/0会触发ArithmeticException(算术异常),但你的catch块只监听了NullPointerException,这个异常完全没被处理。
  • Java的规则是:当未被捕获的运行时异常出现时,JVM会先执行完finally块(这也是finally的核心特性:只要进入了try块,它就一定会执行),然后直接终止当前线程(这里就是程序的主线程)。线程都终止了,后面的"rest of the code..."自然没机会执行。
  • 而无异常场景下,try块正常执行完毕,不会触发任何异常,程序会跳过catch块,执行finally后继续走后续代码,所以能正常打印。

怎么让finally后的代码正常执行?

最简单的办法就是捕获对应的异常,让程序能从异常中恢复,继续执行:

class TestFinallyBlock1 { 
    public static void main(String args[]) { 
        try { 
            int data=25/0; 
            System.out.println(data); 
        } catch(ArithmeticException e) { // 捕获正确的异常类型
            System.out.println("遇到算术异常:" + e.getMessage()); 
        } finally { 
            System.out.println("finally block is always executed"); 
        } 
        System.out.println("rest of the code..."); // 现在就能正常打印了
    } 
}

如果不确定会抛出什么异常,也可以捕获更宽泛的Exception(不过更推荐精确捕获,避免隐藏其他问题):

catch(Exception e) {
    System.out.println("捕获到异常:" + e);
}

额外知识点

  • 除非你在代码里调用了System.exit(0)这种直接终止JVM的方法,否则只要进入了try块,finally块一定会执行——哪怕你在try或catch里用了return、break,finally还是会先执行完。
  • 未被捕获的异常会向上传递,如果一直到线程顶层都没被捕获,线程就会终止,后续代码全部停止执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:38