下面是这本书的一段话:
覆盖方法不得抛出比覆盖方法声明的异常新的或更广泛的检查异常。例如,声明FileNotFoundException的方法不能被声明SQLException、Exception或任何其他非运行时异常的方法覆盖,除非它是FileNotFoundException的子类。
现在我的问题是,如果超类中的方法抛出一个异常,那么重写方法能否根本不抛出一个异常?
因为我刚刚在Java中尝试了这个,其中覆盖方法没有抛出任何异常,并且没有错误。
请解释一下。
可以将重写方法声明为抛出的异常类型比超类少,但不能引入新的异常。子类方法必须与超类方法的行为兼容。更确切地说,您必须能够在不破坏任何内容的情况下用子类的对象替换超类的对象(在这种情况下,向throws子句添加新的checked异常将意味着调用它的东西必须更改代码来处理它)。
(这背后的想法是Liskov替换原则:程序应该能够在高级别上处理对象,而不会陷入关于所有对象的确切类型的细节中。如果子类可以引入变化,这意味着程序必须将其挑选出来并以不同的方式处理,那么它就无法达到抽象的目的。)
因此,可以将覆盖方法声明为根本不抛出检查过的异常(通过完全省略throws子句),因为这不需要对任何调用者进行更改。
JDK中有一些例子,比如java。io,其中子类不可能抛出由超类声明的异常(请参阅ByteArrayOutputStream close方法)。在这里,close方法可以删除其throws子句,因为它从不抛出IOException。(可能是因为有人想用一个确实抛出IOException的版本对它进行子类划分?)
问题内容: 这是我的代码块。 这段代码无法编译,因为我在Line1中添加了“ throws”。 编译器抱怨重写的方法不能引发异常。 为什么这样 ?。 为什么覆盖的方法不能引发异常? 因为我可以通过在子类的实现中添加n行代码来覆盖基类中的方法。 这些添加的代码会引发异常,所以为什么我不能在重写的方法中使用“引发”? 问题答案: 重写的方法可以引发Exception,只要被重写的方法也抛出相同的Exc
问题内容: 我遇到了必须重写Object的toString()方法的问题,但是原始方法没有引发任何异常。但是,我正在使用一些需要抛出异常的通用代码。 这是FavoriteList.java的一部分。这些异常必须抛出。如果有某种方法可以抑制这些异常或将它们捕获到方法中,那将很有帮助。 最后,我的方法标题必须如下所示: 我不在乎方法的结尾内容。只要编译就可以了。我只需要修复标题,但是找不到解决方法。提
subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:
为什么重写方法可以在java中抛出未经检查的异常? 为什么重写方法不能抛出比重写方法更广泛的异常?这不是我的问题。我只是想知道为什么重写方法可以抛出未检查的异常,而不能抛出已检查的异常。
我有一个抛出检查异常的方法: 我正在尝试创建一个通用包装器,它将优雅地处理异常。 现在我正在使用,它给我编译时错误。我可能错过了什么?
在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循