try、catch、finally與return

1 try catch finally語句基礎知識 spa

  1. finally必定會被執行。
  2. try塊發生異常纔會執行catch塊。
  3. 若是finally塊中拋出異常,則整個try、catch、finally塊中拋出異常。

 

 

 

2 try catch finally語句與return語句 3d

一、finally塊必定會被執行。即便已經執行了return語句。code

例:blog

public class Test{
    public static String func(){
        Integer i=0;
        try{
            System.out.println("執行try語句塊");//1
            return i.toString();//2
        }finally{
            System.out.println("開始執行finally語句塊,i的值爲:"+i);//3
            i++;//4
            System.out.println("結束執行finally語句塊,i的值爲:"+i);//5
        }
    }

    public static void main(String[] args) {
        System.out.println("開始執行main");//0
        System.out.println("執行func的結果爲:"+func());//5
        System.out.println("結束執行main");//6
    }
}

 

輸出:編譯器

開始執行main
執行try語句塊
開始執行finally語句塊,i的值爲:0
結束執行finally語句塊,i的值爲:1
執行func的結果爲:0
結束執行main

 

 

從該例可看出,外層代碼先獲取方法的返回值,等待方法內部finally語句執行結束後,外層方法繼續執行。即try、catch、finally語句中,執行return後,對當前返回的值作任何的修改,都不影響已經return的返回值。io

 

 

二、try塊中有return語句,catch塊中也必須有return語句。不然沒法經過編譯。編譯

 

return語句在try-catch-finally塊以前。顯然這會提示異常,提示去除try{}catch(){}finally{}塊。class

 

因爲return通常都處於代碼塊執行的最後。因此若try塊拋出異常,則return語句確定還未執行。異常被catch捕獲,catch必須完成try沒有完成的return。基礎

 

 

三、若是finally塊中有return 語句,則返回try或catch中的返回語句忽略。方法

public class TryCatchFinally {

    

    static int method(){

        try{

            return 0;

        }catch(Exception e){

            return 1;

        }finally{

            System.out.println("finally{}");

            return 2;

        }

    }

    

    public static void main(String[] args) {

        int i = method();

        System.out.println(i);

    }

}

 

輸出:

finally{}

2

 

 

finally中有return語句,編譯器會提示警告。

 

 

 

3 使用try、catch、finally語句塊中須要注意

一、儘可能在try或者catch中使用return語句。經過finally塊中達到對try或者catch返回值修改是不可行的。

二、finally塊中避免使用return語句。由於finally塊中使用return語句會顯示的消化掉try、catch塊中的異常信息,屏蔽了錯誤的發生。

三、finally塊中避免再次拋出異常。不然整個包含try語句塊的方法回拋出異常,而且會消化掉try、catch塊中的異常。

相關文章
相關標籤/搜索