最终阻止

时间:2018-05-08 17:08:55

标签: java return finally

今天我遇到了一个场景,其中一个分配是在一个finally块内完成的,类似的代码片段如下所示

    public static void main(String[] abc) {
    System.out.println("Returned \t"+ testFinally());
}

public static int testFinally() {
    int aVariable =2;
    try {
        System.out.println("value of aVariable inside try \t"+aVariable);
        return aVariable;
    } finally {
        aVariable = 100;
        System.out.println("value of aVariable inside finally \t"+aVariable);
    }
}

输出对我来说有点奇怪

  

aVariable里面的值try 2

     

aVariable里面的值最终为100

     

返回2

然后我尝试使用StringBuffer和String

  

使用StringBuffer

    public static StringBuffer testFinallyStringBuffer() {
    StringBuffer strBuffer = new StringBuffer("ABCD");
    try {
        System.out.println("value of strBuffer inside try \t"+strBuffer);
        return strBuffer;
    } finally {
        strBuffer.append("EFGN");
        System.out.println("value of strBuffer inside finally \t"+strBuffer);
    }
}

输出

  

尝试ABCD中的strBuffer值

     

最终ABCDEFGN内的strBuffer值

     

返回ABCDEFGN

产出符合预期。

  

使用String

    public static String testFinallyString() {
    String str = "ABCD";
    try {
        System.out.println("value of str inside try \t"+str);
        return str;
    } finally {
        str = str + "EFGN";
        System.out.println("value of str inside finally \t"+str);
    }
}

输出

  

str里面的值试试ABCD

     

最终ABCDEFGN内的str值

     

返回ABCD

从这种行为看,似乎变量(原始/不可变对象/可变对象)从try块传递到finally块,类似参数传递给方法。虽然,使用finally块是为了进行清理活动。但我想知道我的理解是否正确或者还有更多的东西。

  

更新

尽管如此,我在Question问题中找不到任何令人满意的问题,而该问题已被标记为重复。但是,很少有评论声称Return语句的评估只发生一次。

话虽如此,Still变量是局部范围。在稍后访问这些内容时,应该可以看到对它们所做的任何更改。

可能,RETURN在内部创建了一个返回变量的副本(在调用finally之前并实际返回到调用方法之前),这就是原始变量和不可变对象在这种情况下与可变对象的行为不同的原因。

1 个答案:

答案 0 :(得分:0)

与传递给finally块的变量类型无关,但与您有关的是返回 值或引用

在第一种情况下,返回2(作为副本)并且对finally块内变量的更改正在更改函数中的 本地副本

在你的第二种情况下,同样的情况发生但由于返回类型是 引用 ,你在finally块中修改它,所以修改发生在同一个底层对象

就像将int传递给函数vs传递对象引用并通过引用更改对象一样