1. 程式人生 > >Java異常try裡面有return,finally程式碼會執行嗎

Java異常try裡面有return,finally程式碼會執行嗎

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

肯定會執行。finally{}塊的程式碼只有在try{}塊中包含遇到System.exit(0);之類的導致Java虛擬機器直接退出的語句才會不執行。

當程式執行try{}遇到return時,程式會先執行return語句,但並不會立即返回——也就是把return語句要做的一切事情都準備好,也就是在將要返回、但並未返回的時候,程式把執行流程轉去執行finally塊,當finally塊執行完成後就直接返回剛才return語句已經準備好的結果。

例如我們有如下程式:

public class Test

{

       publicstatic void main(String[] args)

       {

              System.out.println(new Test().test());;

       }

       staticint test()

       {

              int x = 1;

              try

              {

                     returnx;

              }

              finally

              {

                     System.out.println("finally塊執行:" + ++x);

              }

       }

}

此時的輸出結果為:

finally塊執行:2

1

看到上面程式中finally塊已經執行了,而且程式執行finally塊時已經把x變數增加到2了。但test()方法返回的依然是1,這就是由return語句執行流程決定的,Java會把return語句先執行完、把所有需要處理的東西都先處理完成,需要返回的值也都準備好之後,但是還未返回之前,程式流程會轉去執行finally塊,但此時finally塊中的對x變數的修改已經不會影響return要返回的值了。

但如果finally塊裡也包含return語句,那就另當別論了, 因為finally塊裡的return語句也會導致方法返回,例如把程式該為如下形式:

public class Test

{

       publicstatic void main(String[] args)

       {

              System.out.println(new Test().test());;

       }

       staticint test()

       {

              int x = 1;

              try

              {

                     returnx++;

              }

              finally

              {

                     System.out.println("finally塊執行:" + ++x);

                     returnx;

              }

       }

}

此時的輸出結果為:

finally塊執行:3

3

正如介紹的,程式在執行returnx++;時,程式會把return語句執行完成,只是等待返回,此時x的值已經是2了,但程式此處準備的返回值依然是1。接下來程式流程轉去執行finally塊,此時程式會再次對x自加,於是x變成了3,而且由於finally塊中也有return x;語句,因此程式將會直接由這條語句返回了,因此上面test()方法將會返回3。