2017-03-17 51 views
3
package com.ami.practice; 
public class UnrechebleStatement { 
public static void main(String[] args) { 
    System.out.println(m()); 
     } 

public static int m(){ 
    try{ 
     int x=0; 
     int y=10/x; 
     return y; 
    }catch(Exception e){ 
     return 1; 
    }finally { 
     return 2; 
    } 
    } 
} 
+9

因爲它的定義與[Java語言規範](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls- 14.20.2)。 –

+1

http://stackoverflow.com/a/65049/4297364 –

+1

爲什麼你認爲這個關鍵字最終被命名爲...... – GhostCat

回答

1

最後塊總是執行......閹嘗試執行或趕上...

3
JLS#14.17

帶表達式的return語句試圖將控制轉移到的調用者

包含它的方法; Expression的值將成爲方法調用的值。更確切地說,執行這樣的返回語句首先評估表達式。如果由於某種原因,表達式的評估突然完成,那麼由於這個原因,返回語句會突然完成。如果表達式的計算正常完成,產生一個值V,則返回語句完成突然,原因是與價值V.返回

[...]

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

尤其是第二部分要完全回答你的問題

+0

它看起來不錯,你能解釋在提供的示例代碼中的流程嗎?即使finally被執行,第一個返回被調用,然後第二個返回被調用。爲什麼使用第二個回報的價值? – matt

+0

@matt作爲'JLS'狀態,'return 1'試圖將controll傳回給調用者,但底層的'finally''返回2'會突然出現'catch'' return',並將控制權轉回與由'finally'子句中提供的'return'提供的值。 – SomeJavaGuy

1

最後總是叫除了在某些情況
1)如果System.exit()的調用
2)如果JVM崩潰
3)如果我們使用嵌套try catch

相關問題