4

オブジェクトのキャストとメソッドのオーバーライドを理解しようとしています。

私はコードを持っています:

    public class ExceptionClass{
        void m() throws SQLException{}

    }

    class A extends ExceptionClass{

        void m() throws Exception{}
    }

これにより、「例外 Exception は ExceptionClass.m() の throws 句と互換性がありません」というエラーが発生します。

次のように書いても同じです:

    public class ExceptionClass{
        void m() throws SQLException{}
    }

    class A extends ExceptionClass{

        void m() throws RuntimeException{}
    }

これはエラーを発生させず、メソッドも適切にオーバーライドされます。SQLException は Exception クラスから拡張されているため、サブクラスで「SQLException」を「Exception」に置き換えることはできません (オーバーライドされたメソッドのシグネチャを変更しています)。

しかし、私はこれをしました:

    public class ExceptionClass{
        void m() throws NullPointerException{}
    }

    class A extends ExceptionClass{
        void m() throws RuntimeException{}  
    }

しかし、ここにはエラーはありません..! 上記の理由により、同じエラーが発生するはずだと思いました。

なぜこのように振る舞うかはわかりません。また、メソッド シグネチャで例外をスローするメソッドをオーバーライドするときに従うべき規則は何ですか。

4

3 に答える 3

4

NullPointerExceptionRuntimeException両方とも未チェックの例外です。

throws条項に記載する必要はありません。

于 2012-07-04T16:28:46.010 に答える
3

オーバーライドされたメソッドでスローされた例外を削減または排除することしかできません。より広範な例外をスローすることは、言語によって許可されていません。

Java ドキュメントから:

「オーバーライド メソッドの throws 句は、このメソッドが、その throws 句によって、オーバーライドされたメソッドがスローすることを許可されていないチェック済み例外をスローする結果になることを指定しない場合があります。」

于 2012-07-04T16:29:24.197 に答える
1

はい、メソッド シグネチャの変更が原因で最初の問題が発生したことは正しいです。署名でランタイム例外を宣言する必要がないため、NPE と RuntimeException を使用してさらに刺激することは正しくありません。

于 2012-07-04T16:29:12.710 に答える