基礎用法:java
int f1() { try{ return 1; }finally { System.out.println("finall執行"); } } @Test public void testFinally() { System.out.println(f1()); }
輸出:函數
finall執行
1
結論:try中返回函數時,finally會先執行。測試
// 返回普通變量,finally中修改無效 int f1() { int ret = 1; try { return ret; } finally { ret = 2; System.out.println("f1 finall執行"); } } // 返回引用類型,finally中修改有效 int[] f2() { int[] ret = {1}; try { return ret; } finally { ret[0] = 2; System.out.println("f2 finall執行"); } } // return 的表達式在finally結束後才執行 int f3() { try { return 1 / 0; } finally { System.out.println("f3 finall執行"); } } @Test public void testFinally() { System.out.println(f1()); System.out.println(Arrays.toString(f2())); System.out.println(f3()); }
輸出:spa
f1 finall執行 1 f2 finall執行 [2] f3 finall執行 java.lang.ArithmeticException: / by zero
結合以上f2(修改引用有效)和f3(return表達式延遲執行)的測試,會認爲如下代碼運行,獲得的數據爲空,但實際上不是:code
List<String> list = new ArrayList<>(); List<String> f1() { try { return new ArrayList<>(list); } finally { list.clear(); System.out.println("清空數據"); } } @Test public void testFinally() { list.add("123"); System.out.println("返回數據:" + f1()); }
輸出結果:對象
清空數據
返回數據:[123]
運行規律很差把握,因此實際使用中儘可能避免這種寫法,容易致使bug。blog
其餘測試結論:同步函數中,finally未執行時,對象鎖不會釋放。同步