Java中的finally

基礎用法: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未執行時,對象鎖不會釋放。同步

相關文章
相關標籤/搜索