异常处理中的引用数据类型与基本数据类型差异
在学习异常处理的时候发现了一个有意思的问题
首先来观察一段代码:
public class Test1 {
public static void main(String[]args) {
System.out.println(exceptTest());
}
public static int exceptTest(){
int age= 0;
try{
age= 10;
return age;
}catch (Exception e){
return 0;
}
finally {
age= 20;
}
}
}
我们都知道,在异常处理中,finally块内的语句是必然执行的,那么return的age应该是20,来看一下输出:
可以看到,实际输出却是10,这是为什么呢?来看一下程序的执行流程:
在执行完1到达ruturn的时候实际是先将age的值备份,再进入到finally中,在执行返回之前也将finally中age的值备份,最后return,实际上return的还是第一次备份的值,也就是10.
再来看下面这段代码:
public class Test {
public static void main(String[]args) {
Student s= exceptTest();
System.out.println(s.age);
}
public static Student exceptTest(){
Student s= new Student();
try{
s.age= 10;
return s;
}catch (Exception e){
return null;
}
finally {
s.age= 20;
}
}
static class Student{
int age;
}
}
这次的输出又是多少呢?我们来看一下结果:
没错,这次是20,这又是为什么呢?
再来看一遍执行流程:
可以看到,整体的执行流程还是一样,但是在备份上却出现了差异,因为对象的属性实际上是引用类型,那么在备份的时候,实际是将地址的引用指向了备份的值,如此一来,最后age地址引用就指向了20。