java - 抽象方法中的多态性和检查异常抛出
问题描述
假设我们有一个类Foo
,其中一个方法可能会抛出IOException
.
public abstract class Foo {
public abstract void foo() throws IOException;
}
FooImpl
但是,当我像这样扩展该类时:
public class FooImpl extends Foo {
public void foo() throws Exception {
throw new Exception("This cannot throw!");
}
}
这会导致编译时错误:“覆盖的方法不会抛出 java.lang.Exception”
我理解这是因为覆盖方法“可能只抛出它的父方法的检查异常和任何未经检查的异常”
为什么会这样呢?为什么我们要禁止自己抛出更广泛的异常?
(我也在寻找解决方法)
谢谢!
解决方案
您必须始终能够在使用其超类的任何地方使用子类。这几乎就是子类的定义,更普遍地称为Liskov 替换原则。
因此,鉴于 的定义,以下必须Foo
有效:
Foo foo = getFooFromSomewhere();
try {
foo.foo();
} catch (IOException e) {
// handle e
}
...因为这与Foo
.
对于 的这个定义FooImpl
,这是行不通的,因为未处理Exception
的 s 没有IOException
被处理,并且作为已检查的异常,它们必须被捕获或以其他方式处理。
推荐阅读
- mysql - Google 脚本 Jdbc.getCloudSqlConnection 仅适用于我域中的一个用户
- javascript - JavaScript如何从一个函数中获取目标值并乘以已选中复选框的元素值
- amazon-web-services - 配置 AWS Pinpoint 语音配置集
- node.js - 使用 Mac 在终端中设置本地 HTTP 服务器时标签名称无效
- postgresql - IF条件下的Postgres存储过程BEGIN和END
- android - Android Studio 与 PayPal 的集成不起作用
- selenium - 新 chrome 更新后的 selenium 操作错误:过时的元素引用元素未附加到页面文档
- mysql - 查找在另一个表中没有条目的列值
- python - 熊猫情节 - 范围
- c# - 当您开始移动然后跳跃时,玩家跳跃延迟