当我的Master类抛出一个已检查的异常时,override方法也不应该实现已检查的异常??
class Master{
String doFileStuff() throws FileNotFoundException{
return "a";
}
}
public class test extends Master{
public static void main(String[] args){
}
String doFileStuff(){
return "a";
}
}
答案 0 :(得分:0)
覆盖方法应该保留相同的合同。
基本上这意味着它可以抛出FileNotFoundException
或FileNotFoundException
的子类列表,但它不需要。
检查此示例:
Master a = new test();
a.doFileStuff(); //this line might throw an exception, and you should catch it.
//but it is not illegal for test class not to throw an exception
现在,我们可以使用FileNotFoundException
的子类执行相同的操作,并使用与FileNotFoundException
不同的其他异常执行相同的操作。对于后面这种情况,我们将看到我们的代码甚至不会编译,因为doFileStuff
类中的test
方法抛出不是FileNotFoundException
的不同检查异常是非法的。
答案 1 :(得分:0)
覆盖方法时,可以声明所有异常,异常子集或超类方法抛出的异常。您还可以声明任何异常,它是超类方法声明的异常的子类。
除非是超类方法声明的异常的子类,否则不能抛出超类方法未声明的任何异常。
答案 2 :(得分:0)
不是真的,只是为了在代码中显示Admit评论的原因
当您实际有获取它们的风险时可能会抛出异常,如果您的代码中有某个地方throw new FileNotFoundException();
您被迫添加try catch或抛出异常。但是,如果您要覆盖,那么您可以删除威胁,如果添加一些新风险,则必须使用新方法处理它们。
import java.io.FileNotFoundException;
class Master {
String doFileStuff() throws FileNotFoundException {
throw new FileNotFoundException(); // it always throws an exception.
}
}
public class Test extends Master {
public static void main(String[] args) {
String a = new Test().doFileStuff();
String b = new Master().doFileStuff();
}
String doFileStuff() {
return "a"; //It always returns a. No risks here.
}
}
答案 3 :(得分:0)
重写方法没有必要重新声明超类方法抛出的所有Exception
。只需要它不会声明Exception
被抛出超类方法不会抛出
JLS第8.4.8.3节阐述:
更确切地说,假设B是类或接口,A是a B的超类或超接口,以及B中的方法声明n 覆盖或隐藏A中的方法声明m。然后:
如果n有一个throws子句,提到任何已检查的异常类型, 那么m必须有一个throws子句,否则就会发生编译时错误。
对于n的throws子句中列出的每个已检查异常类型, 必须出现相同的异常类或其中一个超类型 m的抛出条款的擦除(§4.6);否则,编译时 发生错误。
如果m的未删除的throws子句不包含超类型 n的throws子句中的每个异常类型,一个编译时 发生未经检查的警告。
这是有道理的。为什么应该一个子类方法可能抛出与它重写的超类方法相同的Exception
?它不会声明其他异常是有道理的,因为这会破坏这种情况:
public class Super
{
public void method() throws FooException {}
}
public class Sub extends Super {
{
public void method() throws FooException, BarException {}
}
然后用法变得不清楚:
Super sup = new Sub();
try {
sup.method();
}
// But the subclass could (if it were allowed here)
// throw BarException!
catch (FooException e) {}
答案 4 :(得分:0)
它在子类中是可选的,请查看以下链接: