継承されたクラスのオーバーライド メソッドは、
オーバーライドされているメソッドよりも少ないまたは狭い例外をスローしますが、より広い例外はスローしません。
このルールの意図を教えてください。
継承されたクラスのオーバーライド メソッドは、
オーバーライドされているメソッドよりも少ないまたは狭い例外をスローしますが、より広い例外はスローしません。
このルールの意図を教えてください。
オーバーライドされたメソッドは、このクラスのオブジェクトが多態的に参照されるときに、基本クラスのメソッド実装によってコントラクトに示されている例外のみを処理できるという理由だけで、新しいまたはより広範なチェック済み例外をスローできません。
親メソッドがスローするかどうかにかかわらず、オーバーライドされたメソッドは未チェックの例外をスローできます。署名で宣言することさえできません。ただし、親メソッドがチェック済み例外をスローする場合、この例外を子でのみ特殊化できます (同じ例外をスローします。それは子孫であるか、またはなしです)。
理解を深めるために、このリンクを参照してください: http://www.javatpoint.com/exception-handling-with-method-overriding
子クラスは、親クラスであるかのように動作できる必要があります。(たとえば) をスローする親クラスのメソッドを呼び出すとき、IOExceptions
突然 を受け取るとは思わないでしょうOtherException
。
例えば
public class ParentClass {
public void doSomething() throws IOException{
}
}
public class ChildClass extends ParentClass{
@Override
public void doSomething() throws IOException, CustomException{
super.doSomething();
}
}
親クラスを使用して doSomething() を呼び出す場合、IO 例外を処理する必要があります。
public static void main(String[] args){
ParentClass p=new ChildClass(); //child class behaving as parent
try {
p.doSomething();
} catch (IOException ex) {
Logger.getLogger(ChildClass.class.getName()).log(Level.SEVERE, null, ex);
}//no catch for secret CustomException that the ChildClass can throw
}
CustomException
しかし、私たちが対処していないスローされる可能性のあるシークレットがあることがわかります(ただしCustomException
、ランタイム例外ではないため、スタック内の上位のメソッドがそれを認識していないか、または対処します)
これは、例外をスローするメソッドをオーバーライドしている場合、スーパー メソッドがスローするのと同じ例外、またはスーパークラスから例外を拡張する例外のみをスローできることを意味します (必要に応じてスローを減らします)。