java catch中抛出异常_JAVA中try-catch异常逃逸

本文详细探讨了Java异常处理机制中try-catch-finally语句块的执行顺序。当try块抛出异常时,catch块会捕获并执行,finally块始终会执行。若catch中再次抛出异常,finally依然执行,但finally抛出的异常会覆盖catch中的异常。如果catch和finally都包含return,最终返回的是finally的返回值。为避免异常丢失,可以在finally中检查并重新抛出catch中的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。

1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?

2) 如果catch中,抛出异常,finally是否继续执行?

3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?

4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?

中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。

答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。

答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?

Java代码  icon_star.png

spinner.gifpublicstaticinttest2() {

try{

System.out.println("try");

thrownewRuntimeException("try");

} catch(Exception e) {

System.out.println("catch");

return1;

} finally{

System.out.println("finally");

return2;

}

}public static int test2() {

try{

System.out.println("try");

throw new RuntimeException("try");

} catch (Exception e) {

System.out.println("catch");

return 1;

} finally {

System.out.println("finally");

return 2;

}

}

如上述代码,那么最终返回的是“1”还是“2”?答案是2。

答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。

答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:

Java代码  icon_star.png

spinner.gifThrowable ex =null;

try{

System.out.println("try");

thrownewRuntimeException("try");

} catch(Exception e) {

ex = e;

} finally{

System.out.println("finally");

if(ex !=null) {

thrownewRuntimeException(ex);

}

return2;

}Throwable ex = null;

try{

System.out.println("try");

throw new RuntimeException("try");

} catch (Exception e) {

ex = e;

} finally {

System.out.println("finally");

if(ex != null) {

throw new RuntimeException(ex);

}

return 2;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值