直接看代碼:java
代碼一:ide
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; } } }
結果:it
1
這說明了什麼問題?class
finally塊裏面的代碼老是在try塊return以後執行?咱們將代碼稍做修改test
代碼二:總結
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 { System.out.println("finally 塊執行了..."); } } }
結果:數據
finally 塊執行了... 1
此時finally塊好像又是在return以前執行的,咱們繼續修改代碼static
代碼三:di
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; return x; } } }
結果:view
2
發現此時返回的是2!!!,那麼finally塊中的代碼究竟是在return以前執行呢仍是在以後和執行呢?其實二者都不是,
確切的說應該在return返回中執行,能夠這樣理解,在try塊中的代碼return以後,會將return的值存儲到數據棧中,此時
並未徹底返回,而後去執行finally塊,在代碼一中,執行finally快的時候,數據棧中已經存儲了return的值爲1,即便
++x也不能改變返回值了,而代碼二中,儘管數據棧中已經存儲了return的值爲1,可是在執行finally塊的時候又return了一次,
直接覆蓋了數據棧中的1變爲了++x,即2。
所以作以總結,finally塊是在try塊還未徹底return的時候執行的!!執行完finally塊以後纔會徹底返回。