try catch finally 与reture

1、finally块里的代码是在return之前执行的。

public class Test {
    public static int testFinally() {
        try {
            return 1;
        } catch (Exception ex) {
            return 2;
        } finally {
            System.out.println("execute finally");
        }
    }
    public static void main(String[] args) {
        int result = testFinally();
        System.out.println(result);
    }
}

输出结果为:

execute finally
1

注意:虽然catch块中也有return语句,但是上面的例子中,try中并没有抛出异常,所以不会执行catch块中的内容。

2、如果try-catch-finally中都有return,那么finally块中的return将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。

public class Test {
    public static int testFinally() {
        try {
            return 1;
        } catch (Exception ex) {
            return 2;
        } finally {
            System.out.println("execute finally");
            return 3;
        }
    }
    public static void main(String[] args) {
        int result = testFinally();
        System.out.println(result);
    }
}

输出结果为:

execute finally
3

3、在try/catch中有return时,在finally块中改变基本类型的数据对返回值没有任何影响;而在finally中改变引用类型的数据会对返回结果有影响。

public class Test {
    public static int testFinally1() {
        int result1 = 1;
        try {
            return result1;
        } catch (Exception ex) {
            result1 = 2;
            return result1;
        } finally {
            result1 = 3;
            System.out.println("execute testFinally1");
        }
    }
    public static StringBuffer testFinally2() {
        StringBuffer result2 = new StringBuffer("hello");
        try {
            return result2;
        } catch (Exception ex) {
            return null;
        } finally {
            result2.append("world");
            System.out.println("execute testFinally2");
        }
    }
    public static void main(String[] args) {
        int test1 = testFinally1();
        System.out.println(test1);
        StringBuffer test2 = testFinally2();
        System.out.println(test2);
    }
}

输出结果为:

execute testFinally1
1
execute testFinally2
helloworld

4、finally块一定会被执行吗?

不一定,以下两种情况下,finally不会执行:

  • try语句没有被执行到。 没有进入try代码块,则对应的finally就不会执行。比如,在try语句之前return就返回了,这样finally不会执行;或者在程序进入java之前就出现异常,会直接结束,也不会执行finally块。

  • 在try/catch块中有System.exit(0)来退出JVM。 System.exit(0)是终止JVM的,会强制退出程序,finally{}中的代码就不会被执行。

本小节内容的组织方式及内容来自:finally代码块的执行情况

Last updated