首页 > 解决方案 > 最后阻止执行

问题描述

当调用下面的方法时,它的打印输出为 6,但我期望输出为 5,因为我在finally块中重新分配了 n = 5。

有人可以帮我吗?

public static int p() {
    int n = 0;
    try {
        n = 6 ;
        return n;
    } catch (Exception e) {
        return n;
    } finally {
        n = 5;
    }
}

标签: javablockfinally

解决方案


这可以通过了解代码的执行顺序来轻松回答。在您的场景中,您将始终在n到达最后一个块之前返回 的值,在您的代码中,您将始终返回 的值6。您将永远不会返回5(Final Block)或0(Catch Block)。

那么为什么你永远得不到0呢?

您永远不会得到0,因为try您的语句部分中的代码try-catch-final在一百万年内永远不会按照它的编写方式抛出任何异常,因此该catch语句是多余的。

那么为什么你永远得不到5呢?

你永远不会得到5,因为执行顺序是块中return的语句try首先执行,然后最后一个块运行。语句是我能想到的try-final唯一语句(很高兴在注释中被证明是错误的)任何代码都在执行 return 语句之后执行。

没有理由在你的场景中你会有最后一个块,除非你不相信垃圾收集器正在做它的工作,在这种情况下你会nullifyn这里拥有财产,就是这样。

您的代码可以很容易地重写如下,因为这6是您的代码将返回的唯一值。

public static int p() {
    return 6;
}

推荐阅读