• java之trycatchfinally代码块与return,throw的执行顺序的探索


      时光荏苒,转眼间毕业都半年了,java编程也五个月了。写代码的过程中,会经常遇到解决代码抛异常的情况。平时只注重完成功能,也没太注意try_catch_finally的内在执行顺序,只知道表面的现象:try里的代码运行出错,catch抓着异常处理,finally最后总要执行。知道一次遇到个少见的问题,当着项目经理的面,把我给难住了,才发现自己会最表面的东西,稍一深入,就跪了。于是痛定思痛,决定做个彻底的爱学的青年。

      闲话到此。下面切入正题。

    1.普通情况(当然,也是最常见的情况)

    我们定义了一个方法,里面有try_catch_finally代码块。

    public void methodA() throws Exception{
       try{
          int i=9,j=0;
          int num= i/j;
    System.out.println("---- run------"); }
    catch(Exception e){ System.out.println("----catch run------"); }finally{ System.out.println("----finally run------"); } }

    我们会看到,程序运行结果:  ----catch run------ ----finally run------

    这是最常见的,最普通的情况。

    2.特殊情况A

    public static int method2_A() throws Exception{
       try{
          return -1;
          System.out.println("---- run------");
       }catch(Exception e){
          System.out.println("----catch run------");
       }finally{
         System.out.println("----finally run------");
       }
    }
    public static void main(String[] args) throws Exception{
      System.out.println(method2_A());
    }

    运行结果:----finally run---  -1

    相信很多朋友到这就会有疑问了:咦,怎么是这种顺序呢?return后不久直接跳出函数了吗?finally怎么也这行了?是的,就是这种顺序。jdk底层是怎么执行字节码文件的,咱不去讨论。我在网上找了很多资料,最有权威的说法:jdk执行到try里的return语句时,会暂时把需要return的值放到一个临时的内存区域,然后执行finally里的代码,finally执行完后,jdk在回到临时存储区域把值return。

    3.特殊情况B

    public static int method3_B() throws Exception{
       try{
          return -1;
          System.out.println("---- run------");
       }catch(Exception e){
          System.out.println("----catch run------");
       }finally{
         System.out.println("----finally run------");
        return -2;
       }
    }
    public static void main(String[] args) throws Exception{
      System.out.println(method3_B());
    }

    运行结果:----finally run---  -2。这次不但try里有return,finally里也有return了,情况和2又不一样了。jdk走到try的return后,把值临时放到临时存储区,然后执行finally代码,(注意)当读到finally里的return后,直接就把这个值return了,不在回到try里存储的临时区域。

    4.特殊情况C(catch里有return,finally里没有return)

    public static int method4_C() throws Exception{
       try{
         int i=9,j=0;
        int num= i/j;
          return -1;
          System.out.println("---- run------");
       }catch(Exception e){
          System.out.println("----catch run------");
         return -2;
       }finally{
         System.out.println("----finally run------");
       }
    }
    public static void main(String[] args) throws Exception{
      System.out.println(method4_C());
    }

    运行结果:---catch run---   ----finally run---  -2。原理和上面类似,jdk执行字节码,遇到代码有异常,到catch里,有return语句,先不return,执行finally。然后回到catch里return语句临时存储区域,把值return。

    5.特殊情况D(catch里有return,finally里有return)

    public static int method5_D() throws Exception{
       try{
         int i=9,j=0;
        int num= i/j;
          return -1;
          System.out.println("---- run------");
       }catch(Exception e){
          System.out.println("----catch run------");
         return -2;
       }finally{
         System.out.println("----finally run------");
    return -3; } } public static void main(String[] args) throws Exception{ System.out.println(method5_D()); }

    运行结果:---catch run---   ----finally run---  -3。原理和上面类似,jdk执行字节码,遇到代码有异常,到catch里,有return语句,先不return,把值存储到临时存储区。执行finally,有return,直接return值,不在回到catch的临时存储区。

    暂时就总结到这,以后有需要在完善。

    你的能量超乎你想象_________
  • 相关阅读:
    http://knockoutjs.com/工作杂记
    wp开发杂记
    [转载]jQuery 顺便学习下CSS选择器 奇偶匹配nthchild(even)
    [转载]各种图像处理类库的比较及选择(The Comparison of Image Processing Libraries)
    [转载]多维数组与Json格式的转化
    [转载]OpenCv,EmguCv及.net之间的互动(The Interaction of OpenCv, EmguCv AND .net)
    [转载].net中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net)
    paip.杀不死进程的原因僵尸进程的解决.txt
    paip.c3p0 数据库连接池 NullPointerException 的解决...
    paip..禁用mmseg 的默认词库. . 仅仅使用自定义词库from数据库.
  • 原文地址:https://www.cnblogs.com/westward/p/5034511.html
Copyright © 2020-2023  润新知