关于finally和return执行顺序(待补充)

Posted lisy0808

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于finally和return执行顺序(待补充)相关的知识,希望对你有一定的参考价值。

代码一:

public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
        }
    }
}
/**output:
1
*/

从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码二:

public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
            return a;
        }
    }
}
/**output:
2
*/

在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码三:

public class Test{ 
    public int add(int a,int b){   
         try {
             return a+b;      
         } 
        catch (Exception e) {  
            System.out.println("catch语句块");
         }
         finally{ 
             System.out.println("finally语句块");
         }
         return 0;
    } 
     public static void main(String argv[]){ 
         Test test =new Test(); 
         System.out.println("和是:"+test.add(9, 34)); 
     }
}
/**output:
finally语句块
和是:43
*/

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

总结:

1.finally{}代码块比return先执行。
2.多个return是按顺序执行的的,多个return执行了一个后,后面的return就不会执行了。
3. 记住一点,不管有不有异常抛出, finally都会在return返回前执行。

以上是关于关于finally和return执行顺序(待补充)的主要内容,如果未能解决你的问题,请参考以下文章

finally,return 的执行顺序

关于try catch finally的执行顺序解释

异常处理关于return语句的执行顺序注意事项

php 关于try catch finally的执行顺序解释

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

finally 和 return语句执行的先后顺序