マイナー・マイナー

隠れた名作の発掘が生きがい。

「throws指定されたメソッドをもつクラス」を継承してオーバライドする際の記述規則


スポンサードリンク

スーパークラスで定義したメソッド(もしくは抽象メソッド)にthrows指定があり,そのクラスを継承したクラスでそのメソッドをオーバライドする場合の記述方法についてまとめました.


まず,次のようなメソッドがスーパークラスで宣言されているとします.

 void メソッド名() thorws A(チェック例外のクラス), B(非チェック例外のクラス){}


上記のメソッドをサブクラスでオーバライドする場合,メソッドの記述には次のような規則があります.

  1. そのまま記述できる.
  2. Aは省略できる.
  3. Bは省略できる.
  4. throws以降は省略できる.
  5. A以外のチェック例外は記述できない.
  6. B以外のチェック例外は記述できる.
  7. Aのサブクラスは記述できる.
  8. Bのサブクラスは記述できる.
  9. 例外クラスのスーパークラスは記述できない.


具体的なプログラムを次に記述します.

//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{}
}


また,インターフェースの実装にも上記のような規則があります.