Java中的finally与return问题
我们知道finally中的语句会在try或catch中return语句完成之前执行,但对引用变量与基本变量,执行结果会产生不同。
首先我们先写一下代码:
public class Demo {
public static void main(String[] args) {
Person p = testOne();
int a = testTwo();
System.out.println("age值为:"+p.age+" a的值为:"+a);
}
public static Person testOne(){
Person p = new Person();
try{
p.age = 18;
return p;
}catch (Exception ignored){
} finally{
p.age = 10;
}
}
public static int testTwo(){
int a = 10;
try{
return a;
}catch (Exception e){
} finally{
a = 100;
}
}
}
class Person{
int age = 0;
}
运行结果:
age值为:10 a的值为:10
从上的代码我们可以看出:对于基本变量,finally中的语句似乎没有在return语句完成前完成对变量a的修改,而事实上:
finally中语句完成了对变量a的修改,但是由于return返回的是系统备份a,所以产生了以上的结果。(可以参考return的底层实现原理)
链接: link.
我们分析下内存更好的方便我们理解:
引用类型变量
在代码执行中会在栈内存中创建变量 p 其值为推内存中对象Person的地址值
(假设为0x123),执行到return时会备份p的值,而此时finally中的语句修改推内存中age的值,由于由于return返回系统备份的pd的值,所以返回的还是0x123,但是由于堆内存中age的已经修改所以最后输出的age值为18。
对于基本变量:
原理同上,但是由于基本变量不会开辟堆内存,所以finally中的语句修改的为栈内存中变量a的值,由于由于return返回系统备份的a的值,所以返回的还是10.