Java SE 8 OCA考试:为何第二个catch块被忽略?
为什么第二个catch块没有被执行?
先看你的代码:
public static void main(String... a) { System.out.print("a"); try { System.out.print("b"); throw new IllegalArgumentException("1"); } catch (IllegalArgumentException e) { System.out.println("c"); throw new RuntimeException("1"); } catch (RuntimeException e) { System.out.println("d"); throw new RuntimeException("2"); } finally { System.out.print("e"); throw new RuntimeException("3"); } }
你的错误核心是对try-catch执行逻辑的误解:同一个try块对应的catch块,只会匹配try块本身抛出的异常;catch块内部抛出的新异常,不会被当前try-catch结构里的其他catch块捕获。
下面是完整的执行流程:
- 执行
System.out.print("a"),输出a - 进入try块,执行
System.out.print("b"),输出b - 抛出
IllegalArgumentException("1"),该异常属于try块抛出的异常,进入匹配流程 - 第一个
catch (IllegalArgumentException e)捕获到异常,执行System.out.println("c"),输出c - 在第一个catch块内抛出
RuntimeException("1"),这个新异常不会回到当前try-catch结构匹配第二个catch块,而是直接触发finally块执行 - 进入finally块,执行
System.out.print("e"),输出e - finally块内抛出
RuntimeException("3"),该异常会覆盖之前的RuntimeException("1"),最终程序抛出此异常终止
所以实际输出是abce加上最终的异常信息,而非你预想的abcde。
简单总结:catch块的作用是处理try块的异常,catch块自身抛出的异常不属于当前try块的异常流程,不会被同层级其他catch块处理,会直接执行finally块后向上抛出。
内容的提问来源于stack exchange,提问作者Rty Euzch
相关产品推荐
相关产品推荐

