zoukankan      html  css  js  c++  java
  • JAVA中try-catch异常逃逸

        有时候一些小的细节,确实比较纠结,对于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. }  
  • 相关阅读:
    linux之正则表达式
    ssh远程连接centos
    centOS网络配置
    linux软件包的管理
    linux内存、进程管理
    cent_os_7进行磁盘分区
    linux文件压缩、磁盘分区、vi和软硬链接
    linux用户、群操作命令和文件权限修改
    c#控制台程序
    c#简易程序解释1
  • 原文地址:https://www.cnblogs.com/jpfss/p/9454792.html
Copyright © 2011-2022 走看看