异常处理中的方法覆盖

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 .. 我希望它有帮助:)

【讨论】:

以上是关于异常处理中的方法覆盖的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 覆盖默认的 REST 异常处理程序

spring boot 覆盖默认的 REST 异常处理程序

java 带有exception的父类方法覆盖问题

SVN 异常处理(一)

异常处理

Swift中的异常处理