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块抛出E1E3时,这两个异常并没有在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()正常结束,回到maintry块,执行最后的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抛给maintry块,被catch (E1 e)捕获,打印0
    4. 执行maincatch后的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()正常结束,回到maintry块,执行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抛给maintry块,被catch (E3 e)捕获(这个catch块没有执行代码)
    6. 执行maincatch后的System.out.println("2 ")
      最终输出:x = 3 8 5 2

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

火山引擎 最新活动