gpt4 book ai didi

java - 调用抛出 Checked 异常的覆盖方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:49:34 25 4
gpt4 key购买 nike

看完Why can't overriding methods throw exceptions ,我明白如果声明为的方法抛出一个 Checked 异常,子类中的覆盖方法只能声明抛出该异常或其子类:

class A {
public void foo() throws IOException {..}
}

class B extends A {
@Override
public void foo() throws SocketException {..} // allowed

@Override
public void foo() throws SQLException {..} // NOT allowed
}

因为 SocketException IS-A IOException 我可以将重写方法声明为抛出 IOException 的任何子类。

在我的程序中,我想调用声明为 throws FileNotFoundException IS-A IOException 的覆盖方法。也用 try-catch block 处理

import java.io.*;
class Sub extends Super{
public static void main (String [] args){
Super p = new Sub();
try {
p.doStuff();
}catch(FileNotFoundException e){

}
}
public void doStuff() throws FileNotFoundException{}
}

class Super{
public void doStuff() throws IOException{}
}

但是我遇到了编译时错误: Screenshot

Sub.java:6: error: unreported exception IOException; must be caught or declared to be thrown
p.doStuff();
^

这是什么原因呢?我有点困惑,因为 Base 类的所有内容也可供子类使用。

除了 IOException(与 Overriding 概念相反)之外,更令人困惑的是捕获 ExceptionThrowable 的能力。

最佳答案

您的对象引用是 Super 类型的,即使您知道它在运行时是一个 Sub 对象。因此编译器正在检查 Super 的方法定义并给你这个编译错误。

这与获得以下编译器错误没有什么不同:

Object o = new String("Hello World");
o.charAt(2); //Obviously not allowed

请务必记住,throws 子句是方法定义的一部分。

关于java - 调用抛出 Checked 异常的覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41826914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com