博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】try-catch
阅读量:5877 次
发布时间:2019-06-19

本文共 1387 字,大约阅读时间需要 4 分钟。

hot3.png

本文转载自http://shift-alt-ctrl.iteye.com/blog/2156937

 

有时候一些小的细节,确实比较纠结,对于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代码  
收藏代码
  1. public static int test2() {  
  2.         try{  
  3.             System.out.println("try");  
  4.             throw  new RuntimeException("try");  
  5.         } catch (Exception e) {  
  6.             System.out.println("catch");  
  7.             return 1;  
  8.         } finally {  
  9.             System.out.println("finally");  
  10.             return 2;  
  11.         }  
  12. }  

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

 

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

 

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

Java代码  
收藏代码
  1. Throwable ex = null;  
  2. try{  
  3.     System.out.println("try");  
  4.     throw  new RuntimeException("try");  
  5. catch (Exception e) {  
  6.     ex = e;  
  7. finally {  
  8.     System.out.println("finally");  
  9.     if(ex != null) {  
  10.         throw new RuntimeException(ex);  
  11.     }  
  12.     return 2;  
  13. }  

 

转载于:https://my.oschina.net/javahongxi/blog/1523957

你可能感兴趣的文章
SQL分布式查询、跨数据库查询
查看>>
C#------连接SQLServer和MySQL字符串
查看>>
Arcgis Licensemanager 不能启动的原因之一(转载)
查看>>
(原)Android在子线程用handler发送的消息,主线程是怎么loop到的?
查看>>
$digest already in progress 解决办法——续
查看>>
虚拟机 centos设置代理上网
查看>>
Struts2中Date日期转换的问题
查看>>
mysql 数据类型
查看>>
Ubuntu 设置当前用户sudo免密码
查看>>
设置tomcat远程debug
查看>>
android 电池(一):锂电池基本原理篇【转】
查看>>
Total Command 常用快捷键
查看>>
ionic 调用手机的打电话功能
查看>>
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
Xcode全局替换内容,一键Replace
查看>>
1000 加密算法
查看>>
exif_imagetype() 函数在linux下的php中不存在
查看>>
Ruby的case语句
查看>>
Linux的链接文件-ln命令
查看>>
maven的tomcat插件如何进行debug调试
查看>>