2013-02-12 82 views
-6
class X extends Exception { 
} 

class Y extends X { 
} 

class Z extends Y { 
} 

public class Test { 

    static void aMethod() throws Z { 
     throw new Z(); 
    } 

    public static void main(String[] args){ 
    int x = 10; 
    try { 
     aMethod(); 
    } 
    catch(X e) { 
     System.out.println(「Error X」); 
     } 
    catch(Y e) { 
     System.out.println(「Error Y」); 
     } 
    } 
} 

什麼是輸出?Java:異常,繼承概念不清楚

(A)的異常將去未捕獲由兩個抓 塊

(B)將打印「錯誤X」

(C)將打印「錯誤Y」

+5

爲什麼不編譯代碼並運行它? – 2013-02-12 13:09:22

+0

-ve投票。這不是測驗網站。 – sudmong 2013-02-12 13:11:24

+0

可能是家庭作業 – 2013-02-12 13:11:25

回答

0

( D)它不編譯;-)

第二個catch塊是無法訪問的。

如果你把它翻過來,並且首先抓住Y你仍然應該得到一個編譯器警告,因爲Z是一個檢查的異常,編譯器會檢測到只有第一個catch子句可以到達。但是這個例子會起作用,並且會打印「錯誤Y」。

Java總是按照它們定義的順序來評估catch子句,這就是您應該首先定義最具體的異常的原因,在這種情況下,catch (Y y)應該在catch (X x)之前。

編輯:在第一個版本中,我認爲編譯器錯誤「無法訪問的代碼」可以用特殊的編譯器設置關閉。感謝Marko Topolnik的澄清。

+0

「當然取決於編譯器設置」?你能詳細說明嗎? – assylias 2013-02-12 13:18:16

+0

JLS強制許多驗證類型的編譯器錯誤。死代碼就是其中之一。 – 2013-02-12 13:18:58

+1

有沒有這樣的事情,「編譯器設置更寬鬆」,這將使該代碼編譯。 – 2013-02-12 13:23:46

0

它不會編譯,因爲方法aMethod拋出「Z」異常,並在主要方法中捕獲「X」和「Y」,因爲「X」是超類「Y」和「Z」。

讓它編譯運行,試圖抓住「Z」和「Y」