【问题标题】:Method Overriding in Exception handling异常处理中的方法覆盖
【发布时间】:2018-11-06 06:11:58
【问题描述】:

在异常处理中,众所周知,如果超类方法不声明异常,子类重写的方法不能声明已检查异常,但可以声明未检查异常。为什么这样?考虑以下示例:

import java.io.*;

class Parent {
    void msg() {
        System.out.println("parent");
    }
}

class TestExceptionChild extends Parent {
    void msg() throws IOException {
        System.out.println("TestExceptionChild");
    }

    public static void main(String args[]) {
        Parent p = new TestExceptionChild();
        p.msg();
    }
}

我尝试过的:

我们在这里得到编译错误。如果我需要在重写方法“msg”中读取文件,那么我必须在此处提及“throws IOException”。但是java不允许它们。谁能解释一下?

【问题讨论】:

    标签: exception-handling try-catch-finally


    【解决方案1】:

    发生这种情况是因为您违反了Liskov substitution principle,即:您不能用子类之一替换超类的实例,因为您正在修改父超类中方法msg 的签名。

    在更通用的类中,方法msg没有抛出任何异常,而你想修改子类中的签名,这显然是不允许的,因为它违反了override主体的约定。

    【讨论】:

      【解决方案2】:

      您需要记住一件事,如果您使用 throws 关键字,那么出现的任何异常都将被转发到调用链中,并且如果在编译时覆盖,编译器会检查覆盖的方法是否存在于父级中,并且 JVM 执行子类方法。 因此,基本上从父方法调用子方法,因此如果子方法抛出任何异常,否则它应该能够处理检查异常,否则 CE .. 我希望它有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-24
        相关资源
        最近更新 更多