try catch finally 返回值的顺序

时间:2021-03-01 05:05:56

标签: java exception try-catch try-catch-finally

我用这段代码来测试 try catch finally:

public class My{
    public static void main(String[] args) {
        System.out.println(fun1());
        System.out.println(fun2());
    }

    public static int fun1() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;
        } finally {
            a = 4;
        }
        return a;

    }

    public static int fun2() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;
        } finally {
            a = 4;
            return a;
        }

    }
}

输出:

3
4

我知道 finally 会一直运行。我认为这两个函数的结果应该是 4,但实际上 fun1() 是 3,而 fun2() 是 4。为什么?

2 个答案:

答案 0 :(得分:3)

这个问题密切相关,虽然它返回的是文字而不是变量:Multiple returns: Which one sets the final return value?

fun1 中,返回值通过 catch 块中的 return a 设置。在该行,a 的值被复制到返回值中。稍后更改 a 不会更改返回值。

fun2 中,您在 finally 块中有一个显式返回,因此 finally 块中的返回值就是返回的值。

请仔细阅读上述问题中的答案,了解为什么不应该编写那样的代码。

另一个相关问题是:Returning from a finally block in Java

答案 1 :(得分:2)

简单来说,当一个函数返回某些东西时,它会从上次执行的 return 语句返回。在 fun2() 中,第一个返回值是 3,它被 finally 块的返回值覆盖,即 4。而在 fun1() 方法中 return 从 3 块设置为 catch 并且由于 func1() 的最后一行从未被执行,因此 3 被返回。

相关问题