【问题标题】:Java: Exception, Inheritance Concepts Unclear [closed]Java:异常,继承概念不清楚[关闭]
【发布时间】:2013-01-27 19:17:38
【问题描述】:
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”

(C) 它将打印“错误 Y”

【问题讨论】:

  • 为什么不编译代码并运行呢?
  • -投票。这不是测验网站。

标签: java exception inheritance


【解决方案1】:

(D) 它不编译 ;-)

第二个 catch 块无法访问。

如果你把它转过来,首先捕获Y,你仍然应该得到一个编译器警告,因为 Z 是一个检查异常,编译器会检测到只能到达第一个 catch 子句。但是这个例子可以运行,并且会打印“Error Y”。

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

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

【讨论】:

  • "当然取决于编译器设置" ?你能详细说明一下吗?
  • 许多验证类型的编译器错误是 JLS 规定的。死代码就是其中之一。
  • 没有“更宽松的编译器设置”之类的东西可以编译该代码。
  • @MarkoTopolnik:你是对的,当然。我走神了,Eclipse 确实允许调整一些编译器错误/警告,但“无法访问的代码”不属于它们。我将相应地编辑答案...
  • 您可以将其表述为反事实:如果 Java 不需要验证这种情况,那么...
【解决方案2】:

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

为了让它编译和运行,试着捕捉“Z”和“Y”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多