Java中,執行try-catch-finally語句須要注意:
第一:return語句並非函數的最終出口,若是有finally語句,這在return以後還會執行finally(return的值會暫存在棧裏面,等待finally執行後再返回)
第二:finally裏面不建議放return語句,根據須要,return語句能夠放在try和catch裏面和函數的最後。可行的作法有四種:
1)return語句只在方法最後出現一次。
2)return語句僅在try和catch裏面都出現。
3)return語句僅在try和方法最後都出現。
4)return語句僅在catch和方法的最後都出現。
注意,除此以外的其餘作法都是不可行的,編譯器會報錯。
(1)若是程序運行到try成功時能夠返回結果,則採用方法2。
(2)若是程序運行到catch時(即中途出錯時)無需再繼續執行後面的代碼了,則採起方法4。
(3)若是程序運行到try或catch時還須要繼續執行後面的代碼,則採起方法1。
1.html
package cn.day006; public class Test { public static void main(String[] args) { System.out.println(getResult()); } @SuppressWarnings("finally") public static int getResult(){ int a =100; try{ return a+1; //注意,java的基礎數據類型是值傳遞,這裏的返回值已經和上面的a沒有關係了 }catch(Exception e){ e.printStackTrace(); }finally{ return a; //最後再把值重定向到a(至關於將try中的返回值覆蓋掉),因此輸出仍是100 } } }
結果:100java
2.函數
package cn.day006; public class Test { public static void main(String[] args) { System.out.println(getResult()); } @SuppressWarnings("finally") public static int getResult(){ int a =100; try{ return a++; //切記 a++ ----> a=a+1 此時a的值作出了改變 }catch(Exception e){ e.printStackTrace(); }finally{ return a; } } }
結果:101spa
3.code
package cn.day006; public class Test { public static void main(String[] args) { System.out.println(getResult()); } public static int getResult(){ int a =100; try{
a++; return a; }finally{ a++; } } }
結果是101。htm
分析:blog
在try語句中,在執行return語句時,要返回的結果已經準備好了,就在此時,程序轉到finally執行了。get
在轉去以前,try中先把要返回的結果存放到不一樣於x的局部變量中去,執行完finally以後,在從中取出返回結果,編譯器
所以,即便finally中對變量x進行了改變,可是不會影響返回結果。博客
它應該使用棧保存返回值。
4.
package cn.day006; public class Test2 { public static void main(String[] args) { try{ System.out.println(getResult()); }catch(Exception e){ e.printStackTrace(); System.out.println("截獲異常catch"); }finally{ System.out.println("異常處理finally"); } } @SuppressWarnings("finally") public static int getResult() throws Exception{ int a =100; try{ a=a+10; throw new RuntimeException(); }catch(Exception e){ System.out.println("截獲異常並從新拋出異常"); throw new Exception(); }finally{ return a; } } }
結果以下:
截獲異常並從新拋出異常
110
異常處理finally
關鍵的「截獲異常catch」卻沒有執行!!!
緣由是在getResult()的finally中return一個值,等同於告訴編譯器該方法沒有異常,但實際上異常是有的,這樣的結果是該方法的調用者卻捕獲不到異常,相對於異常被無故的被吃掉了,隱藏殺機啊!!
參考牛人博客:http://www.cnblogs.com/Fskjb/archive/2012/02/15/2353256.html