1. 程式人生 > >含有return語句的try-catch-finally語句執行順序

含有return語句的try-catch-finally語句執行順序

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