Java中關於return和finally的問題


這兩天學到了異常機制,其中try...catch...finally個人覺得算是重要的一環,聯系到之前學的語句,遇到了return和finally這個好玩的問題,經過試驗,發現計算機語言這種邏輯關系果然微妙,以下是自己的見解,若有不對之處,望各位前輩指點:

首先看第一段代碼

 1 public class return_finally{
 2     public static void main(String[] args){
 3         System.out.println( m_1() );
 4     }
 5     public static int m_1(){
 6         int i=10;
 7         try{
 8             System.out.println( "start" );
 9            return i+=10;
10         }catch(Exception e){
11             System.out.println( "error: "+e );
12         }finally{
13             if(i>10){
14                 System.out.println( i );
15             }
16             System.out.println( "finally" );
17         }
18         return i;
19     }
20 }
第一段代碼輸出結果如下:
    start
    20
    finally
    20
注意,此時第二個return是在finally語句外部,按照return與finally同時出現的規定,我們可以理解為第一個return只是一個條件,他的作用只是尋找finally語句,實際只是執行了一個i+=10的運算,然后直接進入finally語句,最后return返還結果。
我們再看第二段代碼:
 1 public class return_finally{
 2     public static void main(String[] args){
 3         System.out.println( m_1() );
 4     }
 5     public static int m_1(){
 6         int i=10;
 7         try{
 8             System.out.println( "start" );
 9            return i+=10;
10            
11         }catch(Exception e){
12             System.out.println( "error: "+e );
13         }finally{
14             if(i>10){
15                 System.out.println( i );
16             }
17             System.out.println( "finally" );
18             return 50; 
19         }
20     }
21 }

第二段代碼與第一段的區別只是將最后的return放到了finally語句當中,我們可以猜猜輸出的結果:

    start

    20

    finally

    50

此時執行的return已經將之前運算結果所得的20覆蓋,並且返還了50這個數值,也就是說在finally語句中的return是執行了,呃,應該可以這樣說吧~~

還有第三段代碼,大家慢慢享受:

public class return_finally{
    public static void main(String[] args){
        System.out.println( m_1() );
    }
    public static int m_1(){
        int i=10;
        try{
            System.out.println( "start" );
            return i;
        }catch(Exception e){
            System.out.println( "error: "+e );
        }finally{
            if(i>10){
                System.out.println( i );
            }
            System.out.println( "finally" );
                i=50; 
        }
        return i;
    }
}

此時finally語句中多了i=50,那么結果是什么呢?

    start

    finally

    10

這就是結果,finally語句中沒有return語句,那么原來的返回值就不會變化。

那么通過這三個例子可不可以這樣理解:

  碰到try語句中的return,先把值儲存到一個地方,然后尋找finally語句,如果語句中有新的算法,就從那個空間取出這個值進行運算,finally中有return的話就就把“新值”覆蓋那個空間的“舊值”,並最終返回;如果finally中沒有return就直接將那個空間中的“舊值”取出來然后返還回去。

  以上純屬理解,希望大家多多指點,謝謝各位的幫助!

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM