Java中處理異常中return關鍵字

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

相關文章
相關標籤/搜索