1 子类在重写父类抛出异常的方法时,要么不抛出异常,要么抛出与父类方法相同的异常或该异常的子类。如果被重写的父类方法只抛出受检异常,则子类重写的方法可以抛出非受检异常。例如,父类方法抛出了一个受检异常IOException,重写该方法时不能抛出Exception,对于受检异常而言,只能抛出IOException及其子类异常,也可以抛出非受检异常。
举例如下:
class A {
public void fun() throws Exception { }
}
class B extends A {
public void fun() throws IOException, RuntimeException { }
}
父类抛出的异常包含所有异常,上面的写法正确。
class A {
public void fun() throws RuntimeException { }
}
class B extends A {
public void fun() throws IOException, RuntimeException { }
}
子类IOException超出了父类的异常范畴,上面的写法错误。
class A {
public void fun() throws IOException { }
}
class B extends A {
public void fun() throws IOException, RuntimeException, ArithmeticException { }
}
RuntimeException不属于IO的范畴,超出了父类的异常范畴。RuntimeException和ArithmeticException属于运行时异常,子类重写的方法可以抛出任何运行时异常。所以上面的写法正确。
2 子类在重写父类抛出异常的方法时,如果实现了有相同方法签名的接口且接口中的该方法也有异常声明,则子类重写的方法要么不抛出异常,要么抛出父类中被重写方法声明异常与接口中被实现方法声明异常的交集。
举例如下:
class Test
{
public Test() throws IOException
{}
void test() throws IOException
{}
} interface I1{
void test() throw Exception;
} class SubTest extends Test implements I1
{
public SubTest() throws Exception,NullPointerException, NoSuchMethodException
{}
void test() throws IOException
{}
}
在SubTest类中,test方法要么不抛出异常,要么抛出IOException或其子类(例如,InterruptedIOException)。
参考资料