最后用try catch return值的顺序

The order of return value with 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

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

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

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

fun2 中,您在 finally 块中有一个明确的 return,因此 finally 块中的 return 值就是 returned .

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

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

简单来说,当一个函数 return 是它 return 来自最后执行的 return 语句的东西。在 fun2() 中,第一个 return 值是 3,它被 finally 块的 return 值覆盖,即 4。而在 fun1() 方法中,return 从 catch 块设置为 3,并且由于 func1() 的最后一行永远不会执行,因此 3 是 returned.