Java终于回归了

时间:2013-07-10 15:14:20

标签: java return try-catch finally

我有以下问题: 我知道以下代码的输出

try {
    int a = 0;
    System.out.println("The method will return " + a);
    return a;
} catch (Exception e) {
    ;
}
finally {
    System.out.println("Finally executed");
}

将是

The method will return 0
Finally executed

我的问题是:以下代码返回了什么?

int a = 0;
try {
    System.out.println("The method will return " + a);
    return a;
} catch (Exception e) {
    ;
}
finally {
    System.out.println("Finally executed");
    a = 1;
    return a;
}

换句话说,最终是在调用该方法的代码之前还是之后执行的?

5 个答案:

答案 0 :(得分:3)

{return}语句后执行finally块。该方法将返回0,因为到那时已读取a的值并且更改它将不再更改返回值。

要更改返回值,您可以在return块中添加finally语句。这不是真的值得推荐,因为现在执行了两个返回语句,这对大多数人来说都是不直观的。

...
finally {
    System.out.println("Finally executed");
    return 1;
}

答案 1 :(得分:2)

该方法的输出将与以前一样。返回后a的分配将没有明显的效果,即调用者将收到0作为返回值。由于try块没有抛出,因此最后return实际上无法访问。

finally块在计算返回值后执行,但在接收器返回值之前执行。

如果您返回了一个可变对象而不是一个原语,答案会改变,但是:您在finally块中执行的突变(如果有的话)对于您的函数的调用者是可见的:

static int[] test() {
    int[] a = new int[1];
    try {
        System.out.println("The method will return [" + a[0] + "]");
        return a;
    } catch (Exception e) {
        ;
    } finally {
        System.out.println("Finally executed");
        a[0] = 1;
    }
    return a;
}

上面会返回int[] {0},但来电者会int[] {1}

注意:如果您认为这是邪恶的,那么您可能是对的。

答案 2 :(得分:0)

如果没有异常则返回0,或者返回finally语句(1)之后的内容。请注意,因为如果catch抛出异常(事实并非如此),它将不会返回任何值,但finally语句将会运行。

答案 3 :(得分:0)

在返回控制权之前执行finally块。

答案 4 :(得分:0)

输出

The method will return 0
Finally executed

调用者将获得0的值

如果你把调试器放在return语句上。您可以轻松找出更改a的值对返回值没有任何影响的原因