try-catch-finally執行順序的探索(建議採用除錯)
阿新 • • 發佈:2022-03-23
try-catch-finally執行順序的探索(建議採用除錯)
1.try{ }塊中捕捉到異常執行順序
try中的return不會執行---》跳到catch塊中執行,執行其中的return語句,但是不會跳出去--》繼續執行finally中語句並在其中的return語句返回
package com.xurong.test; /** * @auther xu * @date 2022/3/22 - 20:48 */ public class test { public static void main(String[] args) { int a = WithException(); System.out.println(a); } public static int WithException(){ int i=10; try{ System.out.println("i in try block is : "+i); i = i/0;//產生異常 return --i; } catch(Exception e){ System.out.println("i in catch - form try block is : "+i); --i; System.out.println("i in catch block is : "+i); return --i; } finally{ System.out.println("i in finally - from try or catch block is--"+i); --i; System.out.println("i in finally block is--"+i); return --i; } } }
i in try block is : 10
i in catch - form try block is : 10
i in catch block is : 9
i in finally - from try or catch block is--8
i in finally block is--7
6
2.try{ }塊中沒有捕捉到異常執行順序
執行try{ }塊中的return,將執行的return值儲存在棧中---》沒有異常產生,不會執行catch()中的語句--》執行finally內容
package com.xurong.test; /** * @auther xu * @date 2022/3/22 - 20:48 */ public class test { public static void main(String[] args) { int a = WithException(); System.out.println(a); } public static int WithException(){ int i=10; try{ System.out.println("i in try block is : "+i); i = i/1;//沒有產生異常 return --i; } catch(Exception e){ System.out.println("i in catch - form try block is : "+i); --i; System.out.println("i in catch block is : "+i); return --i; } finally{ System.out.println("i in finally - from try or catch block is--"+i); --i; System.out.println("i in finally block is--"+i); return --i; } } }
i in try block is : 10
i in finally - from try or catch block is--9
i in finally block is--8
7
結論一:
return語句並不是函式的最終出口,如果有finally語句,這在return之後還會執行finally(return的值會暫存在棧裡面,等待finally執行後再返回)
結論二:
finally裡面不建議放return語句,根據需要,return語句可以放在try和catch裡面和函式的最後。
補充:
規則:
1.try塊是必須的,catch塊和finally塊都是可選的,但必須存在一個或都存在。try塊不能單獨存在。
2.try塊裡的語句執行中出現異常會跳過try塊裡其他語句,直接執行catch裡的語句。
3.無論try塊中是否有異常,無論catch塊中的語句是否實現,都會執行finally塊裡的語句。
4.只有一種辦法不執行finally塊裡的語句,那就是呼叫System.exit(1);方法,即退出java虛擬機器。
參考:
[https://www.nowcoder.com/profile/168268554/test/54165848/44594#summary]: