zoukankan      html  css  js  c++  java
  • finally,return 的执行顺序

    参考:http://blog.csdn.net/qj19842011/article/details/45675057

    关于finally,return的执行顺序
     例子:
      try{
         return expression;
     }finally{
        do some work;
     }
     1、执行:expression,计算该表达式,结果保存在操作数栈顶;
     2、执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值;
     3、执行:finally语句块中的代码;
     4、执行:将第2步复制到局部变量区的返回值又复制回操作数栈顶;
     5、执行:return指令,返回操作数栈顶的值;
     我们可以看到,在第一步执行完毕后,整个方法的返回值就已经确定了,由于还要执行finally代码块,
     因此程序会将返回值暂存在局部变量区,腾出操作数栈用来执行finally语句块中代码,等finally执行完毕,
     再将暂存的返回值又复制回操作数栈顶。所以无论finally语句块中执行了什么操作,都无法影响返回值,
     所以试图在finally语句块中修改返回值是徒劳的。
     因此,finally语句块设计出来的目的只是为了让方法执行一些重要的收尾工作,而不是用来计算返回值的。

    例子验证:

      

    public class Test1 {    
        public int exp() {
            try {
                System.out.println("5");
                throw new ArithmeticException();
            } catch (ArithmeticException e) {
                System.out.println("6");
                return 2;
            }catch (Exception e) {           //注意:如果前面捕获了子类异常ArithmeticException,这里就捕获再捕获其父类异常,除非还抛出了该父类的其他子类异常。
                System.out.println("7");
                return 3;
            }
    finally { System.out.println("8"); } } public static void main(String[] args) { System.out.println(new Test1().exp()); } }


    执行结果:
    5 //先执行了try
    6      //执行了catch
    8 //执行了finally
    2 //最后再执行catch里面的return语句。

    注意:try,catch,finally代码块里都可能出现return语句,执行情况又是怎么样的呢?

    首先,我们要清楚一点:不管在哪个代码块里出现了return,return这个返回动作都是都是要等到finally代码块执行完之后再执行。

    所以:1.如果finally代码块里有return语句,那么执行finally里的return,返回结果,不再执行其他代码。

       2.如果finally代码块里没有return语句,try代码块里有return语句,那么执行try里面的return返回结果,不再执行其他代码。

       3.如果finally,try代码块里面都没有return语句那么就执行catch里的return语句.

       4.如果函数不用返回值,那么执行完finally代码块后正常结束。

  • 相关阅读:
    C#中结构与类的区别
    LINQ中的聚合操作以及常用方法
    慎用const关键字
    .NET Framework想要实现的功能
    System.Object的一些方法
    你真的了解.NET中的String吗?
    C#学习要点一
    2012年 新的开始!
    java web服务器中的 request和response
    java Thread编程(二)sleep的使用
  • 原文地址:https://www.cnblogs.com/Zchaowu/p/7476181.html
Copyright © 2011-2022 走看看