try{return } finally{ retun }的执行顺序

一、finally的执行顺序

先来看一段代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        System.out.print(fun1());
    }
    public static String fun1() {
        try {
            System.out.print("A");
            return fun2();
        } finally {
            System.out.print("B");
        }
    }
    public static String fun2() {
        System.out.print("C");
        return "D";
    }
}

通过debug代码跟踪,执行顺序是 fun1()的try -> fun1()的return表达式 ->fun2() -> fun1()的finally -> fun1()进行返回表达式的值 ->回到main函数。 因此代码输出是:ACBD

总结执行过程就是:try中的return计算表达式后,等待finally执行完再返回表达式,具体的步骤就不多说了,可以参考这里https://blog.csdn.net/stduent_/article/details/60955365

这么做的好处是什么呢? 它保证了finally里的代码都会被执行到,无论try里调用了return,break,continue。 那么finally就非常适合用于释放。 此外,如果finally里有return,那么try里的return就不会执行,而是执行finally的return

二、try的值用局部变量保存

再看一段代码

import java.util.*;
public class Main {
    public int aaa() {
        int x = 1;
        try {
            return ++x;
        } catch (Exception e) {
        } finally {
            ++x;
        }
        return x;
    }
    public static void main(String[] args) {
        Main t = new Main();
        int y = t.aaa();
        System.out.println(y);
    }
}

执行结果是2。

按照刚才的分析,try里面进行++x, finally进行++x, 最后try中的return执行返回, 这样x不是应该变成3吗?? 实际上JVM在try的return中,通过局部变量进行保存,最后返回的是局部变量。效果就是finally操作的数都不会再影响返回值

If the try clause executes a return, the compiled code does the following:
1.Saves the return value (if any) in a local variable.
2.Executes a jsr to the code for the finally clause.
3.Upon return from the finally clause, returns the value saved in the local variable.

翻译如下:

如果try语句里有return,那么代码的行为如下:
1.如果有返回值,就把返回值保存到局部变量中
2.执行jsr指令跳到finally语句里执行
3.执行完finally语句后,返回之前保存在局部变量表里的值

总结

本篇讲了
1、finally语句的执行顺序
2、finally代码块读写数据不会返回,是利用了局部变量 ; 补充:但是如果修改静态变量,操作是有效的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
new Promise返回一个Promise对象,它表示一个异步操作的最终完成或失败,并可以返回一个值。在Promise对象中,可以使用resolve方法来将操作标记为成功,并返回一个值,或者使用reject方法将操作标记为失败,并返回一个错误信息。 在介绍new Promise return list之前,我们先了解一下Promise的基本用法。Promise构造函数接受一个executor函数作为参数,该函数有两个参数resolve和reject,分别用于将Promise对象标记为成功或失败。executor函数在Promise对象被创建时立即执行。 当executor函数中的异步操作完成时,可以调用resolve方法将Promise对象标记为成功,并返回一个值。如果异步操作失败,则可以调用reject方法将Promise对象标记为失败,并返回一个错误信息。 现在来介绍一下new Promise return list的情况。在executor函数中,可以通过return语句返回一个值,这个值会被resolve方法的参数接收到。这样,在Promise对象的then方法中就可以获取到这个返回值。 下面是一个示例代码: ```javascript const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve([1, 2, 3]); // 返回一个数组 }, 1000); }); promise.then((list) => { console.log(list); // 输出 [1, 2, 3] }); ``` 在上面的代码中,通过setTimeout模拟了一个异步操作,在1秒后调用resolve方法将Promise对象标记为成功,并返回一个数组[1, 2, 3]。在then方法中,通过参数list获取到了这个返回值,并将其打印出来。 希望以上解答对您有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值