1 try catch finally語句基礎知識 spa
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塊中的異常。