Java中finally和return执行顺序

总结:

  • 1 finally语句在return语句执行之后return返回之前执行的

  • 2 finally块中的return语句会覆盖try块中的return返回

  • 3 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变

  • 4 try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况

  • 5 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样

先看示例代码:

public class FinallyTest1 {
    public static void main(String []args){
        System.out.println(test1());
        System.out.println("-------------------------------------------------");
        System.out.println(test2());

    }

    private static int test1() {
        int b = 20;
        try {
            System.out.println("try语句块");
            return b+=80;
        }catch (Exception e){
            System.out.println("catch语句块");
        }finally {
            System.out.println("finally语句块");
            if (b>25){
                System.out.println("b>25,b="+b);
            }
        }
        return b;
    }

    private static int test2() {
        int b = 20;
        try {
            System.out.println("try语句块");
            return b+=80;
        }catch (Exception e){
            System.out.println("catch语句块");
        }finally {
            System.out.println("finally语句块");
            if (b>25){
                System.out.println("b>25,b="+b);
            }
            return 200;
        }
    }

}

结果:

try语句块
finally语句块
b>25,b=100
100
-------------------------------------------------
try语句块
finally语句块
b>25,b=100
200

说明return语句已经执行了,然后再去执行finally,等finally执行完后,再返回来return 结果。

这里finally语句块中有return,就直接return结束了,try语句块中的return根本不会再执行了。(finally块中的return语句会覆盖try块中的return返回)

接着看:

public class FinallyTest {
    public static void main(String[] args) {

        System.out.println(test());
        System.out.println("-------------------------------------------");
        System.out.println(getMap().get("key").toString());

    }

    public static int test() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80;
        } catch (Exception e) {

            System.out.println("catch block");
        } finally {

            System.out.println("finally block");

            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }

            b = 150;
        }

        return 2000;
    }

    public static Map<String,String> getMap(){
        HashMap<String, String> map = new HashMap<>();
        map.put("key","init");

        try {
            map.put("key","try");
            return map;
        }catch (Exception e){
            map.put("key","catch");
        }finally {
            map.put("key","finally");
            map=null;
        }
        return map;
    }

}

结果:

try block
finally block
b>25, b = 100
100
-------------------------------------------
finally

为什么测试用例1中finally里的b = 150;并没有起到作用而测试用例2中finally的map.put("KEY", "FINALLY");起了作用而map = null;却没起作用呢?

这就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址,这也是为什么map = null这句不起作用。

try块中的return在异常情况下不会执行

 

public class FinallyTest {
    public static void main(String []args){
        System.out.println(test1());
        System.out.println("-------------------------------");
        System.out.println(test2());

    }
    //try块中的return在异常情况下不会执行
    private static int test1() {
        int b = 20;
        try {
            System.out.println("try语句块");
            b=b/0;
            return b+=80;
        }catch (Exception e){
            b+=15;
            System.out.println("catch语句块");
        }finally {
            System.out.println("finally语句块");
            if (b>25){
                System.out.println("b>25,b="+b);
            }
            b+=50;
        }
        return b;
    }
   //异常发生,catch中的return执行情况和未发生异常的try中return执行情况一样
    private static int test2() {
        int b = 20;
        try {
            System.out.println("try语句块");
            b=b/0;
            return b+=80;
        }catch (Exception e){
            System.out.println("catch语句块");
            return b+=15;
        }finally {
            System.out.println("finally语句块");
            if (b>25){
                System.out.println("b>25,b="+b);
            }
            b+=50;
        }
    }

}

结果:

try语句块
catch语句块
finally语句块
b>25,b=35
85
-------------------------------
try语句块
catch语句块
finally语句块
b>25,b=35
35

这里try中发生了异常,try中没有return而是被catch,最后到了finally执行了了finally块中的命令

异常发生后,catch中的return语句先执行,确定返回值后再去执行finally,然后再返回catch中的return,finally中对b的改变不造成影响。

参考:https://blog.csdn.net/qq_36299025/article/details/89435275

原创文章 317 获赞 416 访问量 112万+

猜你喜欢

转载自blog.csdn.net/u014082714/article/details/106050735