Java裡Finally的一些細節
阿新 • • 發佈:2018-11-19
本篇部落格的例子來自《碼出高效 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語句。