今晚京東筆試,各種finally,有點迷糊,所以在這裏總結一下。
1、如果在try塊或者catch塊有System.exit(0),直接退出,不執行finally代碼塊
public class Main {
void fun(){
int c=0;
try{
System.out.println("try ");
System.exit(0);
}catch(Exception Ex){
Ex.printStackTrace();
}finally{
System.out.println("finally");
}
}
public static void main(String[] argc) {
Main m = new Main();
m.fun();
}
}
輸出:
try
2、如果無System.exit(0)(這函數功能太強大,直接結束當前應用程序),而且finally中有return語句,則運行到finally中的return語句時直接返回,相當於try和catch中的return語句無效。
public class Main {
int fun(){
int c=0;
try{
System.out.println("try ");
return 0;
}catch(Exception Ex){
Ex.printStackTrace();
return 1;
}finally{
System.out.println("finally");
return 2;
}
}
public static void main(String[] argc) {
Main m = new Main();
System.out.println(m.fun());
}
}
輸出:
try
finally
2
這裏從JVM的角度,分析一下try語句。
1、在try代碼塊中執行。如果出現異常而且有相應的catch語句塊,則轉到相應的catch語句塊執行即2;如果出現異常而且沒有相應的catch語句塊(或者return語句),則保存拋出的的異常(或者返回值),然後轉到finally語句塊執行即3;
2、在catch代碼塊中執行。如果出現異常(或者return語句),則保存拋出的的異常(或者返回值),然後轉到finally語句塊執行即3;
3、在finally代碼塊執行。如果執行到return語句,則直接返回;如果執行結束,則拋出(或者返回)之前保存的異常(或者返回值);
再加一條:如果異常不是在try語句塊和catch語句中出現,則直接拋出。