1.finally在什么時候執行,什么時候不執行?
finally在 電腦關機、程式不再記憶體等非正常情況下不執行,其他情況都執行,
唯一一種在代碼中導致finally不執行的情況就是
System.exit(0);
public class Demo8 {
public static void main(String[] args) {
haha();
}
public static void haha(){
try{
int a = 10;
int b = 0;
System.out.println(a/b);
}catch(Exception e){
//退出JVM
System.out.println("出現例外");
System.exit(0);//唯一一種在代碼中導致finally不執行的情況
//引數0代表正常退出,非零代表非正常退出
}finally {
System.out.println("xxxxxxxxxx");
}
}
}

我們可以看到此時finally陳述句沒有執行
2.下列情況,a為多少?p.age為多少?
1.輸出的a是多少?
public static void main(String[] args) {
int a = haha();
System.out.println(a);
}
public static int haha(){
int a = 10;
try{ //我們只是來學習 finally ,此處并不會出現例外
return a;
}catch(Exception e){
}finally {
a = 20;
}
return 0;
}
我們知道,先執行try陳述句再執行finally(try里面的代碼不會發生例外,不會經過catch), 那么try陳述句里return了,finally還執行嗎?
答案是執行,輸出的a是10.
在try陳述句里return a, 其實是在備份a的值,此時的a是備份的a,已經不是int a = 10 這個a了, 而在備份之后,與回傳之間,finally陳述句執行, 修改的a是上面的a,不是備份的a, 所以備份過準備回傳給方法的a不變,還是10,
2.我們再來看下面這種情況:
此時輸出的p.age是多少?
public static void main(String[] args) {
Person p = haha();
System.out.println(p.age);//此時p.age是多少?
}
public static Person haha(){
Person p = new Person();
try{
p.age = 18;
return p;
}catch(Exception e){
return null;
}finally {
p.age = 28;
}
}
static class Person{
int age;
}
看了上面的內容,也許你會說p.age=28, 因為在備份p.age = 18之后與回傳之間,finally陳述句執行將p.age修改為28修改的是備份的p.age,所以回傳的Person物件p保存的age為18,
但是
我們可以看到p.age被修改成了28
這是因為:Person為參考型別,備份的參考,而不是值,我們finally陳述句里修改的是參考里的值,在備份好的參考回傳給方法的時候,這個參考里的值已經被修改了,這就是參考資料型別和基本資料型別之間的區別
下面我們看圖理解
(基本資料型別保存在堆疊中,參考資料型別保存在堆中)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256778.html
標籤:java




