-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”);
        }
   }
}

出力は何ですか?

(A) 両方の catch ブロックで例外がキャッチされない

(B) 「エラー X」と表示されます</p>

(C) 「エラー Y」と表示されます</p>

4

2 に答える 2

0

(D) コンパイルされません ;-)

2 番目の catch ブロックに到達できません。

YZ はチェックされた例外であり、コンパイラは最初の catch 句にしか到達できないことを検出するため、それを逆にして最初に catchすると、コンパイラの警告が表示されます。しかし、この例は機能し、「エラー Y」が出力されます。

Java は常に定義されている順序で catch 句を評価します。これが、最も具体的な例外を最初に定義する必要がある理由です。この場合catch (Y y)は、前に来る必要がありますcatch (X x)

EDIT:最初のバージョンでは、コンパイラエラー「到達不能コード」は特別なコンパイラ設定でオフにできると想定していました。説明してくれた Marko Topolnik に感謝します。

于 2013-02-12T13:17:00.020 に答える
0

メソッドaMethodが「Z」例外をスローし、メインメソッドで「X」と「Y」をキャッチしているため、コンパイルされません。「X」は「Y」と「Z」の両方のスーパークラスであるため、「Y」のキャッチは到達できません。 .

コンパイルして実行するには、「Z」と「Y」をキャッチしてみてください

于 2013-02-12T13:17:25.157 に答える