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中改变后的该属性的值。
不经历风雨,怎能见彩虹?做一个快乐的程序员。
原文地址:https://www.cnblogs.com/Mr-Elliot/p/13499733.html