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"); }
}
}
这个问题来自SCJP 6,书中说由于第23行的错误导致编译失败。但我学到的是,当你从父类中覆盖方法时,你不能抛出更广泛的异常。在此示例中,我的父类方法不会抛出异常,并且我的ovridden方法抛出IOException,它是Exception的子类。那它为什么不起作用呢?
此外,我正在考虑如果我的父类方法不抛出任何异常,则默认情况下将其视为(( public void process() throws Exception. ))
。那是真的吗?
答案 0 :(得分:0)
此外,我正在考虑如果我的父类方法不抛出任何异常,则默认情况下将其视为((public void process()抛出异常。))。那是真的吗?
事实并非如此。您必须声明方法抛出的每个已检查异常,无论它是在类(具体还是抽象)还是在接口中。
但是,您可以仍然从未声明抛出任何异常的方法中抛出未经检查的异常和/或错误(即RuntimeException
和子类,Error
和子类)(虽然你真的应该避免抛出Error
。
有关详细信息,请参阅the Java language specification, section 11.2。本节的开头是(强调我的):
Java编程语言要求程序包含已检查异常的处理程序,这可能是由于执行方法或构造函数而导致的。对于每个可能结果的已检查异常,方法(第8.4.6节)或构造函数(第8.8.5节)的throws子句必须提及该异常的类或该异常类的一个超类(§ 11.2.3)。
答案 1 :(得分:0)
您的理解不正确
public void process(){}
和
public void process() throws Exception{}
不等同。你能说的是等价的:
public void process() throws RuntimeException{}
根据定义,您不能从子类中的重写方法抛出更广泛的异常。但你总是可以从任何方法中抛出未经检查的异常。
为了更好地理解please read
答案 2 :(得分:0)
是的你必须抛出异常 A类的处理方法
,例外必须是边界,而不是B类例外
这是强制性的,因为polymorphism
如果
A obj=new B();
now
obj.process()
不会被强制处理异常,但实际调用的方法会抛出异常
所以在子类重写方法中可以抛出异常,但优先级低于父类方法