2014-09-29 177 views
2

在Java中,我有一個方法捕獲一個擴展'NewException'的異常'ChildException'。如果該方法調用另一個拋出'NewException'的方法,並讓我們說發生了什麼並拋出它;將捕獲拋出的異常的子類的調用方法捕獲它嗎?將捕獲異常捕獲該異常的父類

public MethodCatchingChildException 
{ 
    try 
    { 
    //stuff 
    callingMethodThrowingNewException(); 
    //stuff 
    } 
    catch (ChildException e) 
    { 
    //stuff 
    } 
} 

那麼調用MethodThrowingNewException的異常會在MethodCatchingChildException中被捕獲嗎?

+2

你有它向後。抓住父母會抓住孩子,但不是相反。 – 2014-09-29 16:07:28

+0

我很抱歉,但你可以只寫代碼,看看結果 – sotcha 2014-09-29 16:10:44

+0

好吧,其實我不能在哪裏。這就是我在這裏問的原因。我正在研究一些不屬於我的代碼,無法編譯。 – 2014-09-29 16:14:56

回答

2

A catch子句將捕獲與異常的聲明類型分配兼容的任何異常。在這種情況下你描述的NewException實例(這不是一個ChildException不會受catch子句捕獲,因爲你不能一個NewException對象分配給ChildException可變

的規則在section 14.20.1 of the Java Language Specification闡明:

如果try塊的執行突然完成,因爲值V的拋,然後有一個選擇:

  • 如果V的運行時類型是分配COMPAT可以使用(§5.2)try語句的任何catch子句的可捕獲異常類,然後選擇第一個(最左邊的)這樣的catch子句。的值V被分配給所選擇的catch子句的參數,並且執行該catch子句的塊,然後有一個選擇:

    • 如果塊正常完成,則try語句正常完成。

    • 如果該塊由於任何原因突然完成,則由於相同的原因,try語句突然完成。

  • 如果V的運行時類型不是分配與可捕獲的異常類try語句中的任何catch子句的兼容,那麼try語句突然結束,因爲該值V.

    的拋它
0

它只會捕獲您指定的異常或它的子類。只需編寫它,以便捕獲父異常,並且您很安全。

1

想作爲一個的instanceof測試

例如

if (e instanceof ChildException) { 
... 
} 

因此指定一個類的類型將捕獲類它的子類。