1. 程式人生 > >Java裡Finally的一些細節

Java裡Finally的一些細節

本篇部落格的例子來自《碼出高效 Java開發手冊》,這本書確實很耐看。很多細節。

接下來看程式碼一:

public class TryCatchFinally {
    public static void main(String[] args) {
        int temp = finallyNotWork();
        System.out.println(temp);
    }
    public static int finallyNotWork(){
        int temp =10000 ;
         try {
              throw new Exception();
         }catch (Exception e){
             return ++temp ;
         }finally {
             temp =99999;
             System.out.println(temp);
         }
    }
}

輸出結果是 :

99999
10001

我們都知道不管發生不發生異常,finally語句是肯定會執行的。此時main方法裡輸出的temp是10001,是因為,finally語句是在return表示式執行後才執行的。①、在以上程式碼中,發生了異常,所以跳到catch語句裡,此時我們要return返回的 ++temp(10001)的值已經被儲存起來了。②然後我們執行了finally語句,將temp的值設為99999,③等finally語句執行完之後我們這裡要返回的值是之前儲存起來的值10001,而不是99999。在方法裡temp的值確實是被改變了,所以第一行輸出的是99999.

接下來看程式碼二:
 

public class TryCatchFinally {
    static int x =1 ;
    static int y =10 ;
    static int z =100 ;

    public static void main(String[] args) {
        int value = finallyReturn();
        System.out.println("value = " + value);
        System.out.println("x = " + x);
        System.out.println("y = " + y);
        System.out.println("z = " + z);
    }
    private static int finallyReturn() {
        try {
            return ++x ;
        }catch (Exception e){
            return ++y ;
        }finally {
            return ++z ;
        }
    }
}

輸出結果如下:

value = 101
x = 2
y = 10
z = 101

執行程式首先到了 return ++x ;  但是與第一張圖中不同的是,我們這裡的finally程式碼塊裡也有return語句。所以最終這個靜態方法的返回值是 finally裡的return, 即++z ,即 101 。 而 x的值,因為成功執行了 ++x的緣故,值變成了2 。

 

所以:

    finally程式碼塊的職責不是對於變數進行賦值的操作,而是清理資源,釋放連線,關閉管道流等操作。如果在finally程式碼塊中使用return語句,會使得返回值的判斷變得複雜,所以避免返回值不可控,我們不要在finally語句塊裡使用return語句。