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:
run()调用doA(),x既不是1也不是2,进入else分支调用doB()doB()中x≠3,打印9,回到doA()的else分支,打印7- 回到
run()的try块,打印3 - 没有异常触发,进入
finally打印5 - 执行
finally后的代码,打印6 run()正常结束,回到main的try块,执行最后的System.out.println("2 ")
最终输出:x = 0 9 7 3 5 6 2
x = 1:
run()调用doA(),x=1,抛出E1异常run()的try块没捕获E1,直接进入finally打印5run()把E1抛给main的try块,被catch (E1 e)捕获,打印0- 执行
main里catch后的System.out.println("2 ")
最终输出:x = 1 5 0 2
x = 2:
run()调用doA(),x=2,抛出E2异常run()的catch (E2 e)捕获异常,打印4- 进入
finally打印5 - 执行
finally后的代码,打印6 run()正常结束,回到main的try块,执行System.out.println("2 ")
最终输出:x = 2 4 5 6 2
x = 3:
run()调用doA(),x既不是1也不是2,进入else分支调用doB()doB()中x=3,先打印8,然后抛出E3异常doA()没捕获E3,直接把异常抛给run()的try块run()的try块没捕获E3,进入finally打印5run()把E3抛给main的try块,被catch (E3 e)捕获(这个catch块没有执行代码)- 执行
main里catch后的System.out.println("2 ")
最终输出:x = 3 8 5 2
内容的提问来源于stack exchange,提问作者stuckii95




