• try finally return问题


    Try finally return问题

    一、Finally不能被执行的情况:

    1、 程序没有执行到try代码块

    2、 Try 或者catch中调用exit()方法让虚拟机关闭

    二、当try和finally中同时含有return语句时,程序是如何执行的,看下面代码:

    public class TryFinallyReturn {

     

        public static void main(String[] args) {

            // TODO Auto-generated method stub

            demo();

            }

        static int demo()

        {

            try {

                System.out.println("执行try代码块");

                return test1();

            }

            finally {

                System.out.println("执行finally代码块");

                return test2();

            }

        }

        static int test1()

        {

            System.out.println("执行try中的return语句");

            return 5;

        }

        static int test2()

        {

            System.out.println("执行finally代码块中的return语句");

            return 2;

        }

    }

    运行结果:

    执行try代码块

    执行try中的return语句

    执行finally代码块

    执行finally代码块中的return语句

    从运行结果我们可以看到是先执行try中的return语句再执行finally语句的,这与我们以前所认识的不太一样:遇到return语句就直接退出函数;那么在try..finally语句中时如何处理的呢?

    实际上是将try语句中return返回的结果存储到一个局部变量中,接着再去执行finally语句,finally语句执行完再将try语句中的值返回(注意:这样的前提是finally代码块中没有return语句,finally语句中有return会导致函数提前结束),看下面两段程序程序,与上面程序基本一致

    一、 将demo()方法的返回值输出

     

    结果输出为2,返回的值为finally代码块中的返回值,因为finally中的return使函数结束,所以不会回到try语句中去将值返回,再看将finally语句中return语句去掉的输出结果:

     

    返回的结果是try语句中的返回值。

    三、又存在这样一个问题:try中的return将返回结果存入到局部变量中,那在finally语句中能否对该返回值进行修改。

    先看结论:可以对引用变量所指向的内存修改,但不能修改存储return返回结果的局部变量的值

    原因:内存图如下:

    public static List getInstance(){
    List<Integer> a = null;(1)
    try{
    a= new ArrayList<>();(2)
    return a;(3)
    }finally{
    a = null;(4)
    System.out.println(a);
    }
    }
    分析:(1)在栈上分配一块空间用于存储变量a
       (2) 在堆上创建一个对象并且变量a指向该对象
        (3)将a的值赋值给b,所以此时a、b同时指向堆上的对象
        (4) 将a断开,此时只有b指向堆对象,所以返回的只依然是堆上的对象
    如果在第四步为a.add(),那面此时堆对象的内容会被改变,返回值也就被改变了
  • 相关阅读:
    [BNUOJ] ACM Battle(贪心)
    [BNUOJ]Training Plan(贪心,dp)
    [BNUOJ]Squared Permutation(线段树,单点更新)
    可以处理重边的求割点(边)模板
    [Python] Spark平台下实现分布式AC自动机(一)
    [HDOJ2222]Keywords Search(AC自动机)
    [GCJ] Qualification Round 2017
    HDU 6298.Maximum Multiple-数学思维题(脑子是个好东西,可惜我没有) (2018 Multi-University Training Contest 1 1001)
    牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
    牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
  • 原文地址:https://www.cnblogs.com/zhaolei1996/p/10581936.html
Copyright © 2020-2023  润新知