throws とオーバーライド

Since: May/4th/2005

メソッドに宣言する throws リストには、継承時のオーバーライドについて注意すべき点があります。

throws 節にチェック例外を含める場合は、サブクラスでのオーバーライド時に注意が必要です。スーパークラスのメソッドがスローする可能性のあるもの以外を指定することはできません。但し、非チェック例外については、サブクラス側のメソッドの throws 節に独自に追加することができます。

次のクラス ExceptionKo のメソッド getMsg() は、スーパークラス ExceptionOya のメソッドをオーバーライドしています。クラス ExceptionKo のメソッド getMsg() のなかでは、チェック例外である java.io.IOException をスローすると宣言しています。スーパークラスのメソッドでは、何もスローしていないので、これは明らかに違反であり、コンパイル時にコンパイル・エラーが発生します。

class ExceptionOya {
	String getMsg() {
		return "Oya.";
	}
}

class ExceptionKo extends ExceptionOya {
	String getMsg() throws java.io.IOException {
		return "Ko. ";
	}
}

class ExceptionExtendsDemo {
	public static void main(String[] args) {
		ExceptionKo obj = new ExceptionKo();
		System.out.println(obj.getMsg());
	}
}
>javac ExceptionExtendsDemo.java
ExceptionDemo.java:8: ExceptionKo の getMsg() は ExceptionOya の getMsg() をオー
バーライドできません。オーバーライドされたメソッドは java.io.IOException をスロ
ーしません。
        String getMsg()
               ^
エラー 1 個


Copyright © 2005 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu