Java内层catch块抛出异常未被外层捕获的问题咨询
兄弟,你说的这个情况确实有点反常——按Java异常处理的逻辑,内层catch抛的异常本该被外层catch稳稳接住,然后打印"10"才对。结合你给出的不完整代码片段,我给你捋几个最可能踩的坑:
异常类型没对上:
要是你内层catch抛的是Error类的异常(比如StackOverflowError),而外层catch只写了捕获Exception,那可就白搭了。因为Error是Throwable的直接子类,和Exception是平级的,外层catch根本不会触发。如果这时候你还设置了全局的未捕获异常处理器(比如Thread.setDefaultUncaughtExceptionHandler)把这个Error悄悄吞了,程序就会看起来"正常执行",但完全没走外层catch的逻辑。内层catch根本没抛出异常:
别笑,这种情况真的很常见——你以为写了throw语句,但实际要么被注释掉了,要么有个条件判断没满足(比如if(某个条件) throw ...,结果条件不成立),甚至误写成了e.printStackTrace()代替抛出。这种情况下,内层异常被处理完,程序就顺着外层try往下走,自然不会触发外层catch,也打不出"10"。finally块搞的鬼:
如果你的内层try-catch外面套了finally块,而且finally里也抛出了异常,那内层catch抛的异常会被直接压制。要是外层catch没捕获finally抛出的异常类型,这个新异常会顶掉原来的,但如果finally的异常被其他逻辑处理了,表面上程序就会"正常执行",但你要找的那个异常早就没影了。线程隔离的问题:
要是你把内层的try-catch放到了另一个子线程里,主线程的外层catch根本管不到子线程的异常。子线程的异常如果被自己的处理器吞了,主线程该干嘛干嘛,完全不会触发外层catch的逻辑。
建议你先把完整的代码贴出来,不过根据经验,最容易踩的就是前两个坑——先检查内层的throw语句是不是真的执行了,再确认抛出的异常类型是不是外层catch能覆盖到的。
内容的提问来源于stack exchange,提问作者shubham daharwal

