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

摘要:
通常,我只关注函数的完成,而不太关注try _ catch _ finally的内部执行顺序只知道表面现象:try中的代码运行错误,catch捕获异常处理,最后总是执行。你在返回后不久就跳出了函数吗?这一次不仅有尝试中的回报,也有最终的回报。情况与2不同。原理与上述类似。当jdk执行字节码时,它会在代码中遇到异常。在catch中,有一个return语句。不要先返回,最后执行。最后执行。有回报。直接返回返回值。它不会返回到捕获物的临时存储区域。

  时光荏苒,转眼间毕业都半年了,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的临时存储区。

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

免责声明:文章转载自《java之trycatchfinally代码块与return,throw的执行顺序的探索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker 安装 redisCSS鼠标点击式变化图片透明度下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转载】java连接MYSQL

原文出自 http://qq163230530.blog.163.com/blog/static/4289250620081186262719/ 这篇文章主要以MySQL为例讲下Java如何连接到数据库的。            当然,首先要安装有JDK(一般是JDK1.5.X)。然后安装MySQL,这些都比较简单,具体过程就不说了。配置好这两个环境后,...

云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core团队

在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法。 帐户 连接数 A 4077 B 3995 C 741 D 698 E 519 上面这5个帐户产生了10030个数据库连接,当看前4个帐户(产生了9511个连接)的名称时,我们打了一个寒颤 —— 这些...

python mock接口返回数据(转载)

Python mock  在测试过程中,为了更好地展开单元测试,mock一些数据跟对象在所难免,下面讲一下python的mock的简单用法。 关于python mock,网上有很多资料,这里不会讲的特别深,但一定会是实用为主,看完后,至少可以让你知道mock是怎样用的。 1.mock对象方法中的返回数据: 我们经常会需要这样的场景,a系统跟b系统联调,b...

JAVA多线程提高八:线程锁技术

前面我们讲到了synchronized;那么这节就来将lock的功效。 一、locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---AbstractOwnableSynchronizer |---AbstractQueuedLongSynchronizer |---AbstractQueued...

WPF学习笔记-行为

样式和资源字典能在一定范围上设置界面的属性效果,但是这些都是相对的是静态的,即使是动态的,也是先定义好的,无法直接按人的操作行为去设置效果。 这里来实现拖动功能,需要引用System.Windows.Interactivity.dll程序集 一,创建行为 1 using System; 2 using System.Collections.Gener...

C#访问Java的WebService添加SOAPHeader验证的问题

这两天做与公司OA的接口,发现C#访问Java的WebService需要提供一个SOAP的头验证信息,但是WebService的WSDL中并没有提供约定的验证信息,所以Visual Studio生成的代理类并没有发现这些内容,所以这个SOAPHeader就必须要自己组织,还遇到一个问题就是SOAP头部信息,OA那边还按照不知道什么实例添加了一个根节点没有的...