zoukankan      html  css  js  c++  java
  • Java中try-catch-finally语句中return的执行顺序总结

    不管有没有出现异常,finally块中代码都会执行; 当try和catch中有return时,finally仍然会执行; 如果finally语句块中也有return语句的话,那么永远直接从finally中返回结果,这也是不建议在finally中return的原因。

    1、try中有return,finally中没有

    public class TryCatchTest {
    
        public static void main(String[] args) {
            System.out.println("test()函数返回:" + test());
        }
    
        private static int test(){
            int i = 0;
            try {
                System.out.println("Try block executing: " + ++i);
                return i;
            }catch (Exception e){
                System.out.println("Catch Error executing: " + ++i);
                return -1;
            }finally {
                System.out.println("finally executing: " + ++i);
            }
        }
    }

    结果如下:

    Try block executing: 1 
    finally executing: 2 
    test()函数返回:1

    return的是对象时,看看在finally中改变对象属性,会不会影响try中的return结果。

    public class TryCatchTest {
        public int vaule = 0;
    
        public static void main(String[] args) {
            System.out.println("test()函数返回:" + test().vaule);
        }
    
        private static TryCatchTest test(){
            TryCatchTest t = new TryCatchTest();
            try {
                t.vaule = 1;
                System.out.println("Try block executing: " + t.vaule);
                return t;
            }catch (Exception e){
                t.vaule = -1;
                System.out.println("Catch Error executing: " + t.vaule);
                return t;
            }finally {
                t.vaule = 3;
                System.out.println("finally executing: " + t.vaule);
            }
        }
    }

    Try block executing: 1 
    finally executing: 3 
    test()函数返回:3

    2、try和finally中均有return

    private static int test(){
        int i = 0;
        try {
            System.out.println("Try block executing: " + ++i);
            return i;
        }catch (Exception e){
            System.out.println("Catch Error executing: " + ++i);
            return -1;
        }finally {
            System.out.println("finally executing: " + ++i);
            return i;
        }
    }

    结果如下:

    Try block executing: 1 
    finally executing: 2 
    test()函数返回:2

    3、catch和finally中均有return

    private static int test(){
        int i = 0;
        try {
            System.out.println("Try block executing: " + ++i);
            throw new Exception();
        }catch (Exception e){
            System.out.println("Catch Error executing: " + ++i);
            return -1;
        }finally {
            System.out.println("finally executing: " + ++i);
            return i;
        }
    }

    输出结果:

    Try block executing: 1 
    Catch Error executing: 2 
    finally executing: 3 
    test()函数返回:3

    总结:

    • 情况一:如果finally中有return语句,则会将try中的return语句“覆盖”掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

    • 情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

    • 情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况:

      • 1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。
      • 2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
    不经历风雨,怎能见彩虹?做一个快乐的程序员。
  • 相关阅读:
    CF821E 【Okabe and El Psy Kongroo】
    BZOJ1231: [Usaco2008 Nov]mixup2 混乱的奶牛
    P1896 [SCOI2005]互不侵犯
    QBXT Day 2 记录
    CF467C George and Job
    【luogu P3373 线段树2】 模板
    【luogu P1306 斐波那契公约数】 题解
    【luogu T24743 [愚人节题目5]永世隔绝的理想乡】 题解
    【luogu P1903 [国家集训队]数颜色】 题解
    莫队算法~讲解
  • 原文地址:https://www.cnblogs.com/Mr-Elliot/p/13499733.html
Copyright © 2011-2022 走看看