异常处理中的方法覆盖
Posted
技术标签:
【中文标题】异常处理中的方法覆盖【英文标题】: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不允许它们。谁能解释一下?
【问题讨论】:
【参考方案1】:发生这种情况是因为您违反了Liskov substitution principle,即:您不能用子类之一替换超类的实例,因为您正在修改父超类中方法msg
的签名。
在更通用的类中,方法msg
没有抛出任何异常,而你想修改子类中的签名,这显然是不允许的,因为它违反了override
主体的约定。
【讨论】:
【参考方案2】:您需要记住一件事,如果您使用 throws 关键字,那么出现的任何异常都将被转发到调用链中,并且如果在编译时覆盖,编译器会检查覆盖的方法是否存在于父级中,并且 JVM 执行子类方法。 因此,基本上从父方法调用子方法,因此如果子方法抛出任何异常,否则它应该能够处理检查异常,否则 CE .. 我希望它有帮助:)
【讨论】:
以上是关于异常处理中的方法覆盖的主要内容,如果未能解决你的问题,请参考以下文章