方法覆盖异常处理

时间:2018-05-27 14:13:34

标签: exception-handling try-catch-finally

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

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"中读取文件,那么我必须提及"抛出IOException"那里。但是java并不允许它们。谁能解释一下呢?

2 个答案:

答案 0 :(得分:0)

这是因为你违反了Liskov substitution principle,即:你不能用一个子类替换超类的实例,因为你正在修改父亲中方法msg的签名超类。

在更通用的类中,方法msg不会抛出任何异常,并且您希望修改子类中的签名,这显然是不允许的,因为它违反了{{1}的合同校长。

答案 1 :(得分:0)

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