含有return語句的try-catch-finally語句執行順序
阿新 • • 發佈:2019-01-26
import java.io.*; public class Mine{ public int method0(){ try{ FileInputStream dis =new FileInputStream("Hello.txt"); //1,丟擲異常 }catch ( IOException ex) { System.out.println("No such file found"); //2.catch捕獲異常,並執行 return -1; //4,return 返回 }finally{ System.out.println("Doing finally"); //3.finally一定會執行,在return之前。 } return 0; } public int method1(int i){ try { System.out.println("try塊..."); return i = i + 5; // 執行次序為,首先try塊中return之前的部分,然後return之後的部分, //接著轉入finally塊繼續執行,(如果finally塊沒有返回語句),執行完finally塊, //再回到try塊,執行return語句. //注意: 這種執行順序只是保證了finally塊一定會被執行, //但finally塊的語句對try塊的return沒有影響. //假如傳入的引數i=0 //則該方法返回值為5(而不是6!) } finally { i++; System.out.println("in finally i = " + i); } } public int method2(int i){ try { System.out.println("try塊..."); return i = i + 5; // 執行次序為,首先try塊中return之前的部分,然後return之後的部分, //接著轉入finally塊繼續執行,(由於finally塊含有返回語句), //程式從finally塊的return語句直接返回,不再執行try塊的return //即:如果在finally語句中也有return,則try語句中的return值會被替換, //不過這種寫法應該是要避免的! //假如傳入的引數i=0 //則該方法返回值為6(而不是5!) } finally { i++; System.out.println("in finally i = " + i); return i ; } } public static void main(String argv[]){ Mine m=new Mine(); System.out.println( m.method0()); int i = 0; System.out.println(" ***********m.method1(i)********" ); System.out.println("init i = "+i); System.out.println( m.method1(i) ); System.out.println("after method1(i), i= "+i ); //java的值傳遞u System.out.println(" ***********m.method2(i)********" ); System.out.println("init i = "+i); System.out.println( m.method2(i) ); System.out.println("after method2(i), i= "+i ); //java的值傳遞u } }
輸出結果為:
No such file found
Doing finally
-1
***********m.method1(i)********
init i = 0
try塊...
in finally i = 6
5
after method1(i), i= 0
***********m.method2(i)********
init i = 0
try塊...
in finally i = 6
6
after method2(i), i= 0
結論:
執行次序為:
首先try塊中return之前的部分,然後return之後的部分(假如關鍵字return後有運算的話),
接著轉入finally塊繼續執行,(如果finally塊沒有返回語句),執行完finally塊,
再回到try塊,執行return語句.
注意: 這種執行順序只是保證了finally塊一定會被執行, 但finally塊的執行結果對try塊的return沒有影響.
此外, 如果finally裡面有return,try中的return不會再執行;
如果try中有了異常,try中的return也不執行(似乎是很顯然的,丟擲異常的程式碼後面的都不會被執行). PS:異常實際上也是一種返回值
程式在catch塊中的執行情況,和try塊一樣.(先catch塊return之前的部分,然後return之後的運算, 接著轉入finally塊繼續執行,執行完finally塊,再回到catch塊,執行return語句)
from:http://hi.baidu.com/shenmike/blog/item/9f6f602cc9e81fed8a139992.html