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語句後才真正開始返回。