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

Java异常抛出后执行流程疑问及代码输出分析

Java异常处理代码分析与疑问解答

嗨,我来帮你拆解这个Java异常处理的问题,先直接回答你的两个疑问,再一步步分析代码的输出结果:

疑问1:捕获异常后是否会继续执行后续代码?

当然会!比如run()方法里的try块抛出E2异常时,对应的catch (E2 e)块会处理这个异常——执行完catch里的System.out.print("4 ")后,一定会进入finally块执行System.out.print("5 "),等finally执行完毕,程序会回到try-catch-finally结构的后面,继续执行run()里的System.out.print("6 ")。简单说:捕获并处理异常后,方法不会终止,会按流程执行后续的正常代码。

疑问2:未捕获异常时,finally后方法是否终止,导致后续代码不执行?

完全正确!当run()的try块抛出E1或E3时,这两个异常并没有在run()内部被catch捕获(run()只写了捕获E2的逻辑),所以程序会先执行finally块的代码,然后直接把异常抛出给run()的调用者(也就是main方法里的try块),此时run()里finally后面的System.out.print("6 ")就不会被执行了——因为方法已经因未捕获的异常终止,不会再走后续的正常流程。

代码输出结果分析

我们逐个看main方法中x取0、1、2、3时的输出:

  • x = 0:

    1. run()调用doA(),x既不是1也不是2,进入else分支调用doB()
    2. doB()中x≠3,打印9 ,回到doA()的else分支,打印7
    3. 回到run()的try块,打印3
    4. 没有异常触发,进入finally打印5
    5. 执行finally后的代码,打印6
    6. run()正常结束,回到main的try块,执行最后的System.out.println("2 ")
      最终输出:x = 0 9 7 3 5 6 2
  • x = 1:

    1. run()调用doA(),x=1,抛出E1异常
    2. run()的try块没捕获E1,直接进入finally打印5
    3. run()把E1抛给main的try块,被catch (E1 e)捕获,打印0
    4. 执行main里catch后的System.out.println("2 ")
      最终输出:x = 1 5 0 2
  • x = 2:

    1. run()调用doA(),x=2,抛出E2异常
    2. run()的catch (E2 e)捕获异常,打印4
    3. 进入finally打印5
    4. 执行finally后的代码,打印6
    5. run()正常结束,回到main的try块,执行System.out.println("2 ")
      最终输出:x = 2 4 5 6 2
  • x = 3:

    1. run()调用doA(),x既不是1也不是2,进入else分支调用doB()
    2. doB()中x=3,先打印8 ,然后抛出E3异常
    3. doA()没捕获E3,直接把异常抛给run()的try块
    4. run()的try块没捕获E3,进入finally打印5
    5. run()把E3抛给main的try块,被catch (E3 e)捕获(这个catch块没有执行代码)
    6. 执行main里catch后的System.out.println("2 ")
      最终输出:x = 3 8 5 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:39:30