Java Can';t重写父类的方法

Java Can';t重写父类的方法,java,overriding,ioexception,Java,Overriding,Ioexception,我在尝试重写父类的方法时遇到编译错误: public class Reader { public void readToDbFromFile(String fileName, String table) throws FileNotFoundException() { .... } } public class ReaderWithBackup extends Reader { @Override public void readToDbFro

我在尝试重写父类的方法时遇到编译错误:

public class Reader {
    public void readToDbFromFile(String fileName, String table) throws FileNotFoundException() {
         ....
    }
}

public class ReaderWithBackup extends Reader {
    @Override
    public void readToDbFromFile(String fileName, String table) throws IOException {
        super.readToDbFromFile();
        doBackup(fileName, table);
    }

    ...
}
它说“重写的方法不会抛出IOException”。这是什么意思?我怎样才能修好它


提前感谢。

被重写的方法抛出
FileNotFoundException
,因此重写方法必须抛出
FileNotFoundException
FileNotFoundException
的子类
IOException
FileNotFoundException
的一个超类,因此重写方法无法抛出它

考虑以下代码:

try {
    Reader reader = ...
    reader.readToDbFromFile(..);
}
catch (FileNotFoundException ex) {
    ..
}

这是有效的代码,因为
readToDbFromFile
方法的
Reader
只能抛出
FileNotFoundException
已检查的异常。如果重写
readToDbFromFile
Reader
的某个子类,则如果将子类的实例分配给
Reader
变量,则此代码必须仍然有效。因此,您的重写方法无法引发原始方法的throws子句未涵盖的异常。

您无法在子类的重写方法中引发超类方法的父异常

由于
FileNotFoundException
IOException
的子类,因此不能在子类中抛出
IOException

因此,您可以通过交换
IOException
FileNotFoundException
:-

public class Reader {
    public void readToDbFromFile(String fileName, String table) throws IOException () {
         ....
    }
}

public class ReaderWithBackup extends Reader {
    @Override
    public void readToDbFromFile(String fileName, String table) throws FileNotFoundException{
        super.readToDbFromFile();
        doBackup(fileName, table);
    }

    ...
}

在您的Parent类中
readToDbFromFile
throw
FileNotFoundException
。您应该在覆盖函数中抛出
FileNotFoundException
not
IOException

比较这两种方法。。。两者都会抛出不同的异常IOException是FileNotFoundException的父级,对吗?如果父方法抛出FileNotFoundException,为什么子类不能对其进行泛化?@JohnBrownstone如果子类决定抛出一个
SocketException
,该怎么办。这是
IOException
的一个子类。但是,父方法只声明它抛出
FileNotFoundException
,因此子方法不应该能够抛出
SocketException