1. 程式人生 > >子類重寫父類的方法時宣告丟擲異常不能比父類範圍大(轉)

子類重寫父類的方法時宣告丟擲異常不能比父類範圍大(轉)

來源

java 中,當我們子類要重寫父類中的方法,如果父類的方法有異常宣告,那麼子類重寫這個方法時候,所要宣告的異常不應該比父類的大。只能是小等,或者可以沒有。原因如下。
假如我們自定意義一個異常:
public class MyException extends Exception {
public MyException(String message) {

}
public MyException() {

}
}

那麼我們有一個父類它將有一個方法,將宣告丟擲這個異常。我們把它做成抽象的(無所謂)
public abstract class ParentException {
public abstract void test() throws MyException;
}
那麼將有一個類使用到上面這個類
public class ExceptionTest {
private ParentException exception;
public ExceptionTest(ParentException exception){
this.exception=exception;
}
public void app(){
try {
exception.test();
} catch (MyException e) {
e.printStackTrace();
}
}
}
對於以上的try~catch 我們就直接捕獲MyException異常。這是正確的,它在編譯的時候是沒有問題的。
假如,有一個ParentException的有一個子類
public class ChildException extends ParentException{
public void test() throws Exception{

}
}
他的方法可以宣告丟擲比父類大的異常,假如它是正確的。
那麼問題來了。當我們執行ExceptionTest類的時候,我們以這個子類做為物件傳進去。
exception.test();這個地方將在執行的時候實際呼叫的是ChildException這個子類的test()方法,而它的宣告拋 出卻是比父類大的異常,這就使得在ExceptionTest類中,捕獲異常處出現了毛病,因為它無法捕獲Exception異常。
綜上所訴,子類重寫父類的方法時候不能宣告丟擲比父類大的異常