为什么 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
所以我知道两个事实:
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