为什么 finally 块不能修改从 catch 块返回的 Integer 类型数据。 Java

Why a finally block can't modify a returned Integer type data from catch block. Java

所以我知道两个事实:

1.Due 即使 Integer i = 9; i 自动装箱它仍然被认为是对象类型,而不是原始类型。

2.In 一个 try-catch-finally 块,finally 只能修改 catch 块返回的值 catch 块 returns一个对象,而不是原始数据。

那么为什么下面的代码仍然打印出来:

10

finally 假设将 returnVal 修改为 20 因为 returnVal 不是原始数据类型?

public class test1 {

     Integer getInt() {
        Integer returnVal = 10;
        try {
            //some code here that will cause an exception
        }
        catch(Exception e) {
            return returnVal;
        }
        finally {
            returnVal += 10;
        }
        return returnVal;

    }

    public static void main(String[] args) {    
        test1 tes = new test1();
        System.out.println(tes.getInt());
    } 
}

以下:

        returnVal += 10;

不修改 returnVal 引用的对象(该对象是不可变的)。相反,它创建一个新对象并更改 returnVal 以指向它。这对提供给 return 的原始引用没有影响 - 返回的是原始对象。

对比一下

class Test2 {

    public static class MutableInteger {
        public Integer value;
        public MutableInteger(Integer value) {
            this.value = value;
        }
    }

    MutableInteger getInt() {
        MutableInteger returnVal = new MutableInteger(10);
        try {
            throw new Exception();
        }
        catch(Exception e) {
            return returnVal;
        }
        finally {
            returnVal.value += 10;
        }
    }

    public static void main(String[] args) {    
        Test2 test = new Test2();
        System.out.println(test.getInt().value);
    }
}

这里,returnVal是可变的,finally块修改对象而不是重新绑定引用。结果,代码打印出 20.

catch块通过return语句完成执行,即return returnVal,由于returnVal是Integer类型,是不可变对象,在finally块中修改它不会反映对其所做的更改。如果 Integer 是 mutable object,那么您会看到值 return 为 20。例如

class MyInteger {
    int value;

    public MyInteger(int i) {
        value = i;
    }

    public void add(int someVal) {
        value += someVal;
    }

    @Override
    public String toString() {
        return "MyInteger{" +
                "value=" + value +
                '}';
    }
}
public class test1 {

     MyInteger getInt(){
         MyInteger returnVal = new MyInteger(10);

        try{
            String[] students = {"Harry","Paul"};
        System.out.println(students[3]);
        }
        catch(Exception e){
            return returnVal;
        }finally {
            returnVal.add(10);
        }
        return returnVal;
    }

    public static void main(String[] args) {

        test1 tes = new test1();
        System.out.println(tes.getInt());
    } 
}

输出 20 因为 MyInteger 是可变对象。

我没有发现任何问题。最后像预期的那样改变一个整数值

/** * * @author alikatkar */ public class 最后测试 {

public static int testInt() {
    int result = 0;

    try {
        throw new Exception();
    } catch (Exception e) {
        result = 2;
        System.out.println("result in catch:"+result);
        return result = 2;
    } finally {
        return result = 3;
    }
}

public static void main(String[] args) {

    System.out.println("Returns:"+FinallyTest.testInt());
}

}

输出: 结果 catch:2

Returns:3