try,catch,finally的用法

Java中try,catch,finally的用法,以前感覺還算熟悉,但看到一篇博文才有更深點的理解,總結網友博客如下。

Java異常處理的組合方式:

1.try+catch 
運行流程:運行到try塊中,如果有異常拋出,則轉到catch塊去處理。然後執行catch塊後面的語句 

2.try+catch+finally 

運行流程:運行到try塊中,如果有異常拋出,則轉到catch塊,catch塊執行完畢後,執行finally塊的代碼,再執行finally塊後面的代碼。

如果沒有異常拋出,執行完try塊,也要去執行finally塊的代碼。然後執行finally塊後面的語句 

3.try+finally 
運行流程:運行到try塊中,如果有異常拋出的話,程序轉向執行finally塊的代碼。那末finally塊後面的代碼還會被執行嗎?不會!因爲你沒有處理異常,所以遇到異常後,執行完finally後,方法就以拋出異常的方式退出。 
這種方式中要注意的是,由於你沒有捕獲異常,所以要在方法後面聲明拋出異常。

共同點:
1.在catch塊和finally塊中仍然可以再拋出新的異常
例如 throw new Exception("illegal invoked");
如果對於新拋出的異常沒有寫try的話,則要在方法後面聲明拋出異常

反之,如果給catch塊或finally塊裏的異常再套上一層try,catch的話,方法後面就不必聲明異常了。


問題:try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後? 

我們來看下面代碼:

public  class Test {

	public static void main(String[] args) {
		System.out.println(new Test().test());;
	}

	static int test()
	{
		int x = 1;
		try
		{
			return x;
		}
		finally
		{
			++x;
		}
	}
	
}
---------執行結果 ---------
1

public class  smallT
{
	public static void  main(String args[])
	{
		smallT t  = new  smallT();
		int  b  =  t.get();
		System.out.println(b);
	}
	
	public int  get()
	{
		try
		{
			return 1 ;
		}
		finally
		{
			return 2 ;
		}
	}
}

---------執行結果 ---------
2

public  class Test {

	public static void main(String[] args) {
		System.out.println(new Test().test());;
	}

	int test()
	{
		try
		{
			return func1();
		}
		finally
		{
			return func2();
		}
	}
	
	int func1()
	{
		System.out.println("func1");
		return 1;
	}
	int func2()
	{
		System.out.println("func2");
		return 2;
	}	
}

-----------執行結果-----------------
func1
func2
2


分析:

從上面3個例子的運行結果中可以發現,try中的return語句調用的函數先於finally中調用的函數執行,也就是說return語句先執行,finally語句後執行。Return並不是讓函數馬上返回,而是return語句執行後,將把返回結果放置進函數棧中,此時函數並不是馬上返回,它要執行finally語句後才真正開始返回。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章