1

テストの準備をしていると、理解できないコードが見つかりました。

このようにメソッドをオーバーライドすると、コンパイルできません。わかりました、十分に公平です。2 行目で親例外をスローする必要があり (throws Exception のように)、問題なく動作します...しかし、7 行目を public void charlie throws NullPointerException で変更できるのはなぜですか?? 私はまだ2行目に何も投げていないので、これは問題なくコンパイルされます.

    1.public class A {
    2.  public void charlie() 
    3.  {
    4. 
    5.  }
    6.  class B extends A{
    7.      public void charlie() throws IOException
    8.      {}
    9.  }
    10.}
4

3 に答える 3

1

答えは簡単です。クラス 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()ですが、コンパイラはそれを認識せず、少なくともコンパイラの観点からはクラスからであるため、クラスのメソッドでスローされた例外を調べません。aBBaA

そのため、クラスのメソッドcharlie()はクラスBと同じ(入力パラメーター、戻り値の型、およびスローされた例外)でなければならずA、メソッドの本体のみを変更できます。

ただし、NullPointerException または UnsupportedOperationException は引き続きスローできます。これらは RuntimeException に属しており、Java の既存のメソッドはすべて自動的に RuntimeException をスローするため、必要なときにいつでもスローできます。

于 2013-05-08T20:17:32.140 に答える
0

IOExceptionキャッチする必要がある例外です。ブロックthrowsなしでメソッドを呼び出すことはできません。try-catch

ただし、次の点を考慮してください。

A myObject;
myObject = new B(); // legal - polymorphism
myObject.charlie();

宣言Aはありませんが、あるため、これはエラーをスローしないと予想されるかもしれません。したがって、このコードは合法ではありません。throwsB

メソッドで宣言されたスローされた例外は少なくても、多くはありません。

于 2013-05-08T19:56:13.117 に答える