java - 如果父方法抛出检查异常,那么是否必须在子类中抛出相同的异常?

标签 java

给定:

static class A {
    void process() throws Exception { throw new Exception(); }
}
static class B extends A {
    void process() { System.out.println("B "); }
}
public static void main(String[] args) {
    A a = new B();
    a.process();
}

在这个问题中,当我调用a.process() 时,它会给我一个编译时错误,提示“必须处理未处理的异常”。但是,如果父方法抛出任何已检查的异常,如果我们重写父方法的实现,则无需在子方法中处理该异常。

为什么仍然检查异常?

最佳答案

重点是编译器不知道您正在调用一个不会抛出任何已检查异常的重写方法。当它看到时:

a.process();

它“不知道”a 的值实际上是对 B 实例的引用。它可以是对 A 实例(或另一个子类的实例)的引用,抛出异常。

如果你想使用特定于子类的签名,你需要:

B b = new B();

相反。然后当编译器看到

b.process();

它将查看方法是如何在 B 中声明的,而不是如何在 A 中声明的。

关于java - 如果父方法抛出检查异常,那么是否必须在子类中抛出相同的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861908/

相关文章:

java - 在 Java 中创建对象实例时出错

java - 将API数据解析到TextView中

java - Velocity #foreach 与 XmlTool 节点列表与文本节点

java - Vaadin 8 `Binder::bindInstanceFields` 是否仅适用于 String 数据类型?

java - Map.keySet 和 Map.values 上的迭代顺序相同吗?

java - 任何人都可以帮助调试我的简单 Java 计算器吗?

java - 在世界风中高效渲染大量多边形

java - 插入 Sql 查询不适用于 HQL

java - 解决字符串缩减算法

java - SpringJunit4ClassRunner——我可以改变注入(inject)资源的生命周期吗?