Java终于返回[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java终于返回[重复]相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

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

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

...
finally {
    System.out.println("Finally executed");
    return 1;
}
另一答案

该方法的输出将与以前一样。在返回之后进行的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}

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

另一答案

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

另一答案

输出将是

The method will return 0
Finally executed

调用者将值取为0

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

另一答案

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

以上是关于Java终于返回[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在片段java类中使用“this”和getLastSignedInAccount时出现错误[重复]

Java初识方法

将字符串从对话框片段返回到活动 [重复]

Android Java:在 onCreateView() 中返回空视图的片段

Android Java将变量从片段传递到活动[重复]

片段中的 EditText 上的空指针异常 [重复]