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
相关产品推荐
相关产品推荐

