總結:java
一、無論有沒有異常,finally中的代碼都會執行
二、當try、catch中有return時,finally中的代碼依然會繼續執行
三、finally是在return後面的表達式運算以後執行的,此時並無返回運算以後的值,而是把值保存起來,無論finally對該值作任何的改變,返回的值都不會改變,依然返回保存起來的值。也就是說方法的返回值是在finally運算以前就肯定了的。
四、若是return的數據是引用數據類型,而在finally中對該引用數據類型的屬性值的改變起做用,try中的return語句返回的就是在finally中改變後的該屬性的值。
五、finally代碼中最好不要包含return,程序會提早退出,也就是說返回的值不是try或catch中的值測試
先執行try中的語句,包括return後面的表達式,
有異常時,先執行catch中的語句,包括return後面的表達式,
而後執行finally中的語句,若是finally裏面有return語句,會提早退出,
最後執行try中的return,有異常時執行catch中的return。指針
在執行try、catch中的return以前必定會執行finally中的代碼(若是finally存在),若是finally中有return語句,就會直接執行finally中的return方法,因此finally中的return語句必定會被執行的。編譯器把finally中的return語句標識爲一個warning.
code
參考代碼:TryCatchTest對象
// 當try、catch中有return時,finally中的代碼會執行麼? public class TryCatchTest { public static void main(String[] args) { // System.out.println("return的返回值:" + test()); // System.out.println("包含異常return的返回值:" + testWithException()); System.out.println("return的返回值:" + testWithObject().age); // 測試返回值類型是對象時 } // finally是在return後面的表達式運算以後執行的,此時並無返回運算以後的值 //,而是把值保存起來,無論finally對該值作任何的改變,返回的值都不會改變,依然返回保存起來的值。 //也就是說方法的返回值是在finally運算以前就肯定了的。 static int test() { int x = 1; try { return x++; } catch(Exception e){ }finally { System.out.println("finally:" + x); ++x; System.out.println("++x:" + x); // finally代碼中最好不要包含return,程序會提早退出, // 也就是說返回的值不是try或catch中的值 // return x; } return x; } static int testWithException(){ Integer x = null; try { x.intValue(); // 造個空指針異常 return x++; } catch(Exception e){ System.out.println("catch:" + x); x = 1; return x; // 返回1 // return ++x; // 返回2 }finally { x = 1; System.out.println("finally:" + x); ++x; System.out.println("++x:" + x); // finally代碼中最好不要包含return,程序會提早退出, // 也就是說返回的值不是try或catch中的值 // return x; } } static Num testWithObject() { Num num = new Num(); try { return num; } catch(Exception e){ }finally { num.age++; // 改變了引用對象的值 System.out.println("finally:" + num.age); } return num; } static class Num{ public int age; } }