Java基礎之finally語句與return語句詳解
一、return語句執行順序
finally語句是在return語句執行之後,return語句返回之前執行的
package exception; public class Demo06 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代碼塊"); return a += 10; }catch (Exception e){ System.out.println("catch中的代碼塊"); }finally { System.out.println("finally中的代碼塊"); if(a > 10){ System.out.println("a > 10,"+"a="+a); } } return a += 50; } }
運行結果:
try中的代碼塊
finally中的代碼塊
a > 10,a=20
20
註意:
a > 10,a=20的結果說明瞭return a += 10已經執行瞭,但是沒有直接返回,而是先去執行finally語句的內容,然後再去返回結果
二、覆蓋問題
finally塊中的return語句會覆蓋try塊的return返回
package exception; public class Demo07 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代碼塊"); return a += 10; }catch (Exception e){ System.out.println("catch中的代碼塊"); }finally { System.out.println("finally中的代碼塊"); if(a > 10){ System.out.println("a>10,"+"a="+a); } return 100; } } }
運行結果:
try中的代碼塊
finally中的代碼塊
a>10,a=20
100
註意:
(1)如果try中有return語句,finally中也有return語句,最終執行的是finally中的return語句
(2)如果finally代碼塊中寫瞭return語句,那麼finally之後的return語句就變成不可到達的語句,需要註釋掉,否則編譯不過
如果finally語句沒有return語句覆蓋返回值,那麼原來的返回值可能因為finally裡的修改而改變也有可能不變
(1)測試1
package exception; public class Demo08 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代碼塊"); return a += 20; }catch (Exception e){ e.printStackTrace(); System.out.println("catch中的代碼塊"); }finally { System.out.println("finally中的代碼塊"); a += 20; if(a > 10){ System.out.println("a > 10,a="+a); } a += 20; } return 200; } }
運行結果:
try中的代碼塊
finally中的代碼塊
a > 10,a=50
30
註意:
對於基本數據類型來說,finally中對返回值的修改不會影響try中的返回變量的值
(2)測試2
package exception; import java.util.HashMap; import java.util.Map; public class Demo09 { public static void main(String[] args) { System.out.println(getMap().get("KEY").toString()); } public static Map<String,String> getMap(){ Map<String,String> map = new HashMap<>(); map.put("KEY","INIT"); try{ map.put("KEY","try"); return map; }catch (Exception e){ e.printStackTrace(); map.put("KEY","catch"); }finally { map.put("KEY","finally"); map = null; } return map; } }
運行結果:
finally
註意:
對於引用數據類型來說,finally中對返回值的修改會影響try中的返回變量的值
三、異常情況
try塊中的return語句在異常的情況下不會被執行
package exception; public class Demo10 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代碼塊"); a = a/0; return a += 50; }catch (Exception e){ a += 15; System.out.println("catch中的代碼塊"); }finally { System.out.println("finally中的代碼塊"); if(a > 20){ System.out.println("a > 20,a ="+a); } a += 10; } return a; } }
運行結果:
try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 20,a =25
35
註意:
try語句塊中發生異常,try語句異常後的內容不會執行,return語句也不會執行,執行的是捕獲到的catch語句塊和finally語句塊
try中發生異常時,return寫在catch語句中
package exception; public class Demo11 { public static void main(String[] args) { System.out.println(func()); } public static int func(){ int a = 10; try{ System.out.println("try中的代碼塊"); a = a /0; return a += 10; }catch (Exception e){ System.out.println("catch中的代碼塊"); return a += 15; }finally { System.out.println("finally中的代碼塊"); if (a > 10){ System.out.println("a > 10, a = "+a); } a += 50; System.out.println(a); } } }
運行結果:
try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 10, a = 25
75
25
註意:
try中發生異常之後,catch中的return語句先執行,確定瞭返回值之後(保存起來,finally中的語句對返回值無影響)再去finally語句塊,執行完之後再返回a的值,finally中對a的修改對返回值無效
四、finally語句一定會被執行嗎?
(1)當程序進入try語句之前就出現異常時,會直接結束
(2)try語句塊中有強制退出時也不會執行finally語句塊中的代碼
System.exit(0);
代碼示例:
package exception; public class Demo12 { public static void main(String[] args) { int a = 10; try{ System.out.println("try block"); System.exit(0); }catch (Exception e){ System.out.println("catch block"); }finally { System.out.println("finally block"); } } }
運行結果:
try block
到此這篇關於Java基礎之finally語句與return語句詳解的文章就介紹到這瞭,更多相關java finally語句與return語句內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!