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.

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM