-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) 它不编译;-)

第二个 catch 块无法访问。

如果你把它转过来,Y先捕获,你仍然应该得到一个编译器警告,因为 Z 是一个检查异常,编译器会检测到只能到达第一个 catch 子句。但是该示例将起作用,并且将打印“错误 Y”。

Java 总是按照定义的顺序评估 catch 子句,这就是你应该首先定义最具体的异常的原因,在这种情况下catch (Y y)应该在之前catch (X x)

编辑:在第一个版本中,我假设编译器错误“无法访问的代码”可以通过特殊的编译器设置关闭。感谢 Marko Topolnik 的澄清。

于 2013-02-12T13:17:00.020 回答
0

它不会编译,因为方法 aMethod 抛出“Z”异常,并且在 main 方法中您正在捕获“X”和“Y”,其中“Y”的捕获是无法访问的,因为“X”是“Y”和“Z”的超类.

要使其编译和运行,请尝试捕获“Z”和“Y”

于 2013-02-12T13:17:25.157 回答