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;
        }finally {
            System.out.println("8");
        }
    }
    public static void main(String[] args) {
        System.out.println(new Test1().exp());
    }
}

执行结果:5         //先执行了try6      //执行了catch8         //执行了finally2         //最后再执行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代码块后正常结束。

时间: 2024-10-09 20:38:39

finally,return 的执行顺序的相关文章

java中finally和return的执行顺序

注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有return语句,那么先执行该return,然后执行finally, 如果finally中也有return, 该出的返回值会覆盖掉try 和 catch中的return值: 如果try..catch..finally语句块之后有return语句, try中.catch中.finally中都没有 (有条件

Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

关于Java中try catch finally throw return的执行顺序问题

try {          normal statement;     //1.          exception occurred;   //2.          return "try";      } catch (Exception ex) {     normal statement;     //3.          return "catch";      } finally {          normal statement;     

java中return与finally的执行顺序

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

Java return和finally执行顺序

在Java语法中,return表示当前执行的结束,finally则是在当前代码块一定会执行的代码块.如果return在finally在之前执行,finally也会执行吗?答案是肯定的! 但是,finally和return的执行顺序则并不是真正意义上的先后顺序. 1 public String test(){ 2 String s = ""; 3 try { 4 s = "try"; 5 System.out.println(s); 6 return s; 7 } c

一个有关Golang Deferred Function 执行顺序的问题

先看一下一段关于defer的解释, 引自<Go程序设计语言> Syntactically, a defer statement is an ordinary function or method call prefixed by the keyword defer.The function and argument expressions are evaluated when the statement is executed, but the actual call is deferred

有return的情况下try catch finally的执行顺序

http://www.cnblogs.com/lanxuezaipiao/p/3440471.html?cm_mc_uid=89442383850615035911861&cm_mc_sid_50200000=1505491196 1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么

有return的情况下try catch finally的执行顺序(最有说服力的总结)

结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:4.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值.举例:情况1:try{}

当C#中带有return的TryCatch代码遇到Finally时代码执行顺序

编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理.这一点比较常见. 现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序.众所周知,return的作用是退出当前函数,不执行return后面的代码.那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则