2013-10-23 52 views
0

我知道,finally塊來執行,即使代碼拋出異常,也成功完成,現在我的疑問是這樣的代碼請問這個代碼工作中的Java內部處理

收益40

這是顯而易見的,但現在如果我

評論返回40;

返回10

任何人可以幫助我瞭解如何JVM返回10爲什麼不抱怨說,函數應該返回一個值。後trycatch

public class ExceptionTest { 
     public static void main(String[] args) { 
     int i= returnSomething(); 
     System.out.println(i); 
     } 

     private static int returnSomething() { 

      try{ 
       System.out.println("try"); 
       return 10; 
      } 
      catch(Exception e) 
      { 
       return 20; 
      } 
      finally 
      { 
       System.out.println("finally "); 
       return 40; 
      } 
     } 

    } 
+0

你可以看看這個[問題](http://programmers.stackexchange.com/q/188858)。它可能會清除你所有的疑惑! – SudoRahul

+0

http://stackoverflow.com/questions/15616984/return-statement-in-java-exception-handling – VAr

回答

1

根據Java語言規範,Section §14.20.2

與最後塊A try語句通過首先執行try塊執行。然後有一個選擇:

  • 如果try塊的執行正常完成,那麼finally塊被執行,然後有一個選擇:
    • 如果finally塊正常完成,則try語句正常完成。
    • 如果finally塊突然結束的原因S,則try語句如果try塊的執行爲完成突然突然完成了原因S.

...

  • 任何其他原因 R,那麼finally塊被執行,然後有一個選擇:
    • 如果finally塊正常完成,則try語句ç由於原因R突然補齊。
    • 如果finally塊由於原因S突然完成,則try語句因S原因突然完成(並且原因R被丟棄)。

當存在在try塊沒有return,則finally塊被執行並在finally塊的return將被使用。

當存在在tryreturn,則可以conscidered該try塊突然結束,但是,根據JLS,所述finally塊將仍然被代碼返回之前執行。

您也可以參考JLS的Section §14.17來幫助理解返回聲明。

有趣的是,在部分的底部注:

前面的描述說:「試圖將控制轉移」,而 不僅僅是「轉移控制」,因爲如果有任何試圖陳述 (§ 14.20)在try塊或catch catch子句包含返回語句的方法或構造函數中,那麼在控制轉移到方法的調用者之前,那些try語句的最後子句將按順序最內層地執行到 或構造函數。突然完成finally子句可能會中斷由return語句啓動的控制傳輸。

0

finally塊執行。因此,如果您發表評論return 40比它會返回try block值,如果沒有發生異常。這就是爲什麼它return 10

如果發生異常,則返回catch block的值爲20

0

這是一個很好的閱讀finally block

finally塊總是在try塊退出時執行。這可確保即使發生意外異常也能執行finally塊。但是最後對於不僅僅是異常處理而言非常有用 - 它允許程序員避免由於返回,繼續或中斷而意外繞過清理代碼。清理代碼放在finally塊中總是一個很好的做法,即使沒有預期的例外情況。

2

只是在try塊執行前return,控制被轉移到塊finally。在執行finally塊時,該函數返回,除非在finally塊本身中有return

因此,當finally塊中有return時,函數返回40,並且在finally塊中沒有返回時返回try塊中的值。


這是建議在finally塊返回。

+0

一個乾淨,簡短的描述。幾乎完美的,(它得到了我的投票),但是你可能想要改變「在達到......之後」的措辭到「在嘗試塊中執行返回之前......」。到達時只是一個模糊的指示,它是在執行之前還是在執行期間。 –

+0

@EdwinBuck謝謝。更新以擺脫歧義。 – devnull