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.
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 } } }
結果:100
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; } } }
結果:101
3.
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。
分析:
在try語句中,在執行return語句時,要返回的結果已經准備好了,就在此時,程序轉到finally執行了。
在轉去之前,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