-2

オーバーライドされたメソッドでより高いチェック例外をスローするクラスがあります。許可されていないことはわかっていますが、なぜこのコードが機能するのですか?

package personaltestlevel1;



public class OverrideExcept {

    public static void main(String args[]) {

        S1 s = new S2();
        try
        {
        s.show(); 
        }catch (NullPointerException e){
        System.out.printf(e.getMessage());
        }
    }  

}

class S1{


    public  void show() throws  NullPointerException {
        try 
        {
        System.out.println("not overriden");
        }catch (Exception e){
        throw new NullPointerException();
        }
    }
}

class S2 extends S1{

    public  void show() throws  RuntimeException {
        try
        {
        System.err.println("overriden");
        }catch (Exception e){
        throw new RuntimeException();}


    }
}

サンプルをチェック例外で更新しました - とにかく動作します。

4

2 に答える 2

1

例として、以下のコードを見てみましょう (いくつかのチェック例外あり):

public class Parent {
    public void m() throws Exception {

    }
}

public class Child extends Parent {
    public void m() throws FileNotFoundException {

    }
}

public class Client {
    public void test() {
        Parent p = new Child();
        try {
            p.m();
        } catch (Exception e) {         
            e.printStackTrace();
        }
    }
}

minは throws 句でParentのみ宣言しますが、 is-a であるため、は宣言できます。ExceptionChildFileNotFoundExceptionFileNotFoundExceptionException

Clientそして、 which invokes monを見ると、in で宣言するだけで、in (実際のオブジェクト)によってスローされたものParentをキャッチできます。FileNotFoundExceptionmChildExceptioncatch

オーバーライドするメソッドが、同じではないチェック例外またはオーバーライドされるメソッドの子であるチェック例外をスローできるようにすることが意味をなさない理由を説明していると思います。

于 2013-03-21T19:09:23.323 に答える
0

スーパークラス参照(ポリモーフィズム)を使用して派生クラスオブジェクトを参照する場合、コンパイラはオーバーライドされたメソッドの実際の派生クラス実装ではなく、オーバーライドされたメソッドのスーパークラスバージョンによってスローされた例外タイプをチェックするだけなので、オーバーライドされたメソッドでより高いまたはより広い例外をスローすることはできません。メソッド。実行時に解決されます。

ここでは、チェックされていない例外であるため、より広範な例外をスローできます(つまり、コンパイラーは、チェックされていない例外のタイプを気にせずチェックしません)。

ただし、メソッドからRuntimeExceptionをスローすることは悪いプログラミング手法です。

于 2013-03-21T19:02:37.490 に答える