Java终于返回[重复]

问题描述 投票:-5回答:5

这个问题在这里已有答案:

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

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;
}

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

java return try-catch finally
5个回答
3
投票

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

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

...
finally {
    System.out.println("Finally executed");
    return 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}

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


0
投票

在返回控制到调用者之前执行finally块。


0
投票

输出将是

The method will return 0
Finally executed

调用者将值取为0

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.