java-finally詳解

今晚京東筆試,各種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語句中出現,則直接拋出。


發佈了59 篇原創文章 · 獲贊 26 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章