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。