異常處理中的引用數(shù)據(jù)類型與基本數(shù)據(jù)類型差異
在學(xué)習(xí)異常處理的時(shí)候發(fā)現(xiàn)了一個(gè)有意思的問題
首先來(lái)觀察一段代碼:
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塊內(nèi)的語(yǔ)句是必然執(zhí)行的没隘,那么return的age應(yīng)該是20烹俗,來(lái)看一下輸出:
可以看到,實(shí)際輸出卻是10恩闻,這是為什么呢艺糜?來(lái)看一下程序的執(zhí)行流程:
在執(zhí)行完1到達(dá)ruturn的時(shí)候?qū)嶋H是先將age的值備份,再進(jìn)入到finally中幢尚,在執(zhí)行返回之前也將finally中age的值備份破停,最后return,實(shí)際上return的還是第一次備份的值尉剩,也就是10.
再來(lái)看下面這段代碼:
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;
}
}
這次的輸出又是多少呢真慢?我們來(lái)看一下結(jié)果:
沒錯(cuò),這次是20边涕,這又是為什么呢晤碘?
再來(lái)看一遍執(zhí)行流程:
可以看到,整體的執(zhí)行流程還是一樣功蜓,但是在備份上卻出現(xiàn)了差異园爷,因?yàn)閷?duì)象的屬性實(shí)際上是引用類型,那么在備份的時(shí)候式撼,實(shí)際是將地址的引用指向了備份的值童社,如此一來(lái),最后age地址引用就指向了20著隆。