class A {
public void process() { System.out.print("A,"); }
}
public class B extends A
{
public void process() throws IOException { //LINE 23
super.process();
System.out.print("B,");
throw new IOException();
}
public static void main(String[] args) {
try { new B().process(); }
catch (IOException e) { System.out.println("Exception"); }
}
}
这个问题来自scjp6,书中说编译将由于第23行的错误而失败。但我学到的是,当您从父类溢出方法时,不能抛出更广泛的异常。在本例中,父类方法不抛出异常,而ovriden方法抛出ioexception,ioexception是exception的子类。那为什么不起作用呢?
此外,我正在考虑,如果我的父类方法没有抛出异常,那么它的默认值将被视为 (( public void process() throws Exception. ))
. 是真的吗??
3条答案
按热度按时间ippsafx71#
是的,您必须有一个由类a的进程方法引发的异常
异常必须比类b的异常更为边界
这是强制性的,因为在
polymorphism
如果不会强制处理异常,但被调用的方法实际抛出异常
所以在子类中重写的方法可以抛出异常,但优先级比父类方法低
yhqotfr82#
你的理解不正确
和
不是等价的。你可以说的是:
根据定义,您不能从子类中重写的方法引发更广泛的异常。但是你可以从任何方法中抛出一个未检查的异常。
为了更好地理解,请阅读
djmepvbi3#
此外,我考虑的是,如果父类方法不抛出异常,则默认情况下它被视为((public void process()throws exception.))。是真的吗??
这不是真的。必须声明方法抛出的每个选中异常,无论它是在类(具体的还是抽象的)还是在接口中。
但是,您仍然可以抛出未检查的异常和/或错误(即,
RuntimeException
以及子类,Error
和子类)的方法,而不是声明抛出任何异常(尽管您确实应该避免抛出异常)Error
是的。有关更多详细信息,请参阅java语言规范第11.2节。本节开头部分(重点):
java编程语言要求程序包含检查异常的处理程序,这些异常可能由方法或构造函数的执行引起。对于每个检查的异常(可能的结果),方法的throws子句(§8.4.6)或建造商(§8.8.5)必须提及该异常的类或该异常的类的超类之一(§11.2.3).