关于这个问题,其实需要注意的。
在子类覆盖父类的方法时,子类方法抛出的异常必须和父类方法相同,或者子类方法抛出的异常是父类方法抛出的异常的子类。
例子:假如ExceptionSub1和ExceptionSub2是ExceptionBase的子类
[code=java]public class Base{
void method throws ExceptionSub1{}
}
public class Sub1 extends Base{
void method throws ExceptionBase{}//编译出错
}
public class Sub2 extends Base{
void method throws ExceptionSub1,ExceptionSub2{}//编译出错
}[/code]
编译都通不过。这是什么原因?
这是因为,假如没有这个限制,那么便会与Java的多态机制冲突。
[code=java]Base base = new Sub2();//子类为父类实例化
try{
base.method();
}catch(ExceptionSub1 e){//仅仅捕获ExceptionSub1
}[/code]
上面的代码编译器认为合法,因为ExceptionSub1是ExceptionBase的子类。但是,ase引用的实际上是Sub2的实例,运行时据多态机制,base.method();实际上调用子类的同名方法,假如Sub2的实例抛出ExceptionSub2异常,异常没有捕获,程序会异常终止。
所以,子类抛出的异常只能更少。 |