zoukankan      html  css  js  c++  java
  • 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的临时存储区。

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

    你的能量超乎你想象_________
  • 相关阅读:
    idea 团队成员修改工程后push推送
    clone克隆远程库工程到本地
    idea本地工程项目push推送到远程库
    Android中使用ViewGroup.removeViews()时出现NullPointException解决方案
    Android项目的targetSDK>=23,在低于Android6.0的部分测试机(类似华为)上运行时出现的系统权限问题
    C#-Xamarin的Android项目开发(三)——发布、部署、打包
    defineProperty 和Proxy双向绑定演示,你还不知道么?
    2020想学习JAVA的同学看过来,最基础的编程CRUD你会了没?
    三面拿杭州研究院50offer:面对这些问题,你都能做到嘛??
    ROS 机器人技术
  • 原文地址:https://www.cnblogs.com/westward/p/5034511.html
Copyright © 2011-2022 走看看