zoukankan      html  css  js  c++  java
  • java中return在Try-Catch中的执行顺序

    我们知道return会结束此方法并返回指定值。以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的。但是如果return包含在try-catch-finally中的try或catch块中会怎样呢?

    我们再做个试验:

      1        static int txt(){
      2               try {
      3                      @SuppressWarnings("unused")
      4                      int a=5/0;
      5                       
      7               } catch (Exception e) {
      8                      System.out.println("catch");
      9                return 2;
     10               }finally{
     11                      System.out.println("finally");
     12               }
     13               return 3;
     14        }
    demo

    看上面代码我们知道在try中”int a=5/0”是肯定会报错的接下来程序会进入catch中进行异常处理但是在catch中使用return 返回了一个2;这时finally中的代码到底还会会走呢?如果finally中的代码走了的话,return返回的结果又是什么?

    我们来开一下调用此方法输出的结果:

    image

    我们可以看到finally块即使catch块有return他还是会被执行的

    我们再来开下面一个例子

      1        static int txt(){
      2               try {
      3 
      4                      int a=5/0;
      5 
      6 
      7               } catch (Exception e) {
      8                      System.out.println("catch");
      9                      return 2;
     10               }finally{
     11                      System.out.println("finally");
     12                      return 3;
     13               }
     14 
     15        }
    demo

    这时return返回的又是多少呢?

    话不多时来看结果吧:

    image

    我们可以这摸理解:我们定义一个有返回值类型的方法时系统会自动声明一个堆栈上的内存地址用来存放此方法返回的值这也是我们定义一个有返回值类型的方法却没有给定返回值是产生编译错误的原因!当程序执行到catch块的return时会吧return后面的值存放在事先声明的堆栈内存中并不结束此方法后再执行finally块的代码,但是finally块中也有return关键字所以在事先声明的堆栈内存中保存的值也就变成了finally块中return后面的值。又因为finall块后有没有强制执行的代码块所以此方法结束。

    以上内容为个人理解如有 不足之处请各位大神多多指正。

    思考:

      1        static int txt(){
      2               int a=1;
      3               try {
      4 
      5                      a++;
      6                      return a;
      7 
      8               }finally{
      9                      ++a;
     10               }
     11        }
    demo

    此方法的返回值是多少。

  • 相关阅读:
    Spark源码分析之Sort-Based Shuffle读写流程
    浅谈Spark2.x中的Structured Streaming
    Spark应用提交
    js面向对象插件的做法框架new goBuy('.cakeItem',{ add:'.add', reduce:'.reduce' },[1,0.7,0.6]);
    dubbo 运行过程
    linux 监控命令
    DUBBO Thread pool is EXHAUSTED!
    线程池深入(li)
    高性能、高流量Java Web站点打造的22条建议
    Maven 打胖jar
  • 原文地址:https://www.cnblogs.com/wangzheand/p/5424912.html
Copyright © 2011-2022 走看看