答えは簡単です。クラス A の元のメソッドが例外のスローを「サポート」していない場合、クラス B の上書きメソッドで例外をスローすることはできません。
メソッドを別の場所から呼び出すとします。
A a = new A();
a.charlie();
charlie
クラスのメソッドはA
例外をスローしないので、問題ありません。そのメソッドが例外をスローする場合は、次のように記述する必要があります
A a = new A();
try {
a();
} catch(IOException ex) { //or any other exception
//oh noes
}
しかし、クラスポリモーフィズムと呼ばれるものが作業モードを複雑にするため、複雑になります。
private A getA() {
return new B(); //this will work since B extends A
}
private void doSomething() {
A a = new A(); //you could also write A a = new B();
a.charlie();
}
現在、このコードはa
クラスのオブジェクトであり、スローされた例外のないA
メソッドを持っています。はクラスからのオブジェクトcharlie()
ですが、コンパイラはそれを認識せず、少なくともコンパイラの観点からはクラスからであるため、クラスのメソッドでスローされた例外を調べません。a
B
B
a
A
そのため、クラスのメソッドcharlie()
はクラスB
と同じ(入力パラメーター、戻り値の型、およびスローされた例外)でなければならずA
、メソッドの本体のみを変更できます。
ただし、NullPointerException または UnsupportedOperationException は引き続きスローできます。これらは RuntimeException に属しており、Java の既存のメソッドはすべて自動的に RuntimeException をスローするため、必要なときにいつでもスローできます。