スーパークラスで定義したメソッド(もしくは抽象メソッド)にthrows指定があり,そのクラスを継承したクラスでそのメソッドをオーバライドする場合の記述方法についてまとめました.
まず,次のようなメソッドがスーパークラスで宣言されているとします.
void メソッド名() thorws A(チェック例外のクラス), B(非チェック例外のクラス){}
上記のメソッドをサブクラスでオーバライドする場合,メソッドの記述には次のような規則があります.
- そのまま記述できる.
- Aは省略できる.
- Bは省略できる.
- throws以降は省略できる.
- A以外のチェック例外は記述できない.
- B以外のチェック例外は記述できる.
- Aのサブクラスは記述できる.
- Bのサブクラスは記述できる.
- 例外クラスのスーパークラスは記述できない.
具体的なプログラムを次に記述します.
//A:チェック例外のクラス「ClassNotFoundException」 //B:非チェック例外のクラス「ClassCastException」 class ErrorSuper { void error() throws ClassNotFoundException, ClassCastException{} } //Aのサブクラス class ClassNotFoundExceptionSub extends ClassNotFoundException {} //Bのサブクラス class ClassCastExceptionSub extends ClassCastException{} //(1)そのまま記述できる. class ErrorSub1 extends ErrorSuper{ void error() throws ClassNotFoundException, ClassCastException{ } } //(2)Aは省略できる. class ErrorSub2 extends ErrorSuper{ void error() throws ClassNotFoundException{ } } //(3)Bは省略できる. class ErrorSub3 extends ErrorSuper{ void error() throws ClassCastException{ } } //(4)throws以降は省略できる. class ErrorSub4 extends ErrorSuper{ void error() { } } //(5)A以外のチェック例外は記述できない. class ErrorSub5 extends ErrorSuper{ //void error() throws InterruptedException{} } //(6)B以外のチェック例外は記述できる. class ErrorSub6 extends ErrorSuper{ void error() throws ArithmeticException{ } } //(7)Aのサブクラスは記述できる. class ErrorSub7 extends ErrorSuper{ void error() throws ClassNotFoundExceptionSub{} } //(8)Bのサブクラスは記述できる. class ErrorSub8 extends ErrorSuper{ void error() throws ClassCastExceptionSub{} } //(9)例外クラスのスーパークラスは記述できない. class ErrorSub9 extends ErrorSuper{ //void error() throws Exception{} }
また,インターフェースの実装にも上記のような規則があります.