ホームページ > Java > &#&チュートリアル > サブクラス メソッドは、スーパークラス メソッドよりも広範囲のチェック済み例外をスローできますか?

サブクラス メソッドは、スーパークラス メソッドよりも広範囲のチェック済み例外をスローできますか?

Linda Hamilton
リリース: 2024-11-29 09:57:11
オリジナル
959 人が閲覧しました

Can a Subclass Method Throw Broader Checked Exceptions Than Its Superclass Method?

メソッドの例外宣言のオーバーライドについて

Java では、サブクラス内のメソッドをオーバーライドする場合、オーバーライド メソッドはスローに関する特定の規則に従う必要があります。例外。具体的には、オーバーライド メソッドは、新しいチェック例外、またはオーバーライド メソッドで宣言された例外よりも広範囲のチェック例外をスローできません。

たとえば、基本クラスのメソッドが FileNotFoundException をスローするように宣言されている場合、サブクラスのオーバーライド メソッドはスローできません。 SQLException、Exception、またはサブクラスではないその他の非ランタイム例外FileNotFoundException.

制限の背後にある理由

この制限は、ポリモーフィズムの原理とリスコフ置換原理 (LSP) に由来しています。 LSP では、プログラムの動作が正しい状態を保つために、サブクラスはどのような状況でも基本クラスの代わりに使用できる必要があると規定しています。

オーバーライドするメソッドがより広範な例外をスローできる場合、LSP に違反します。たとえば、基本クラスのメソッド foo() が IOException をスローすることを宣言し、オーバーライドするメソッドが SQLException をスローすることを宣言した場合、コンパイラは呼び出し元に IOException の処理を​​強制しません。

ただし、サブクラスが基本クラスとして扱われると、呼び出し元はオーバーライド メソッドによってスローされる広範な例外を予期しない、または処理する準備ができていない可能性があります。これにより、実行時例外や予期しない動作が発生します。

次のコードを考えてみましょう。

class A {
   public void foo() throws IOException {..}
}

class B extends A {
   @Override
   public void foo() throws SocketException {..} // allowed

   @Override
   public void foo() throws SQLException {..} // NOT allowed
}
ログイン後にコピー

この例では、オーバーライド メソッドクラス B は IOException のサブクラスであるため、SocketException をスローできます。ただし、SQLException は IOException のサブクラスではないため、SQLException をスローすることはできません。

未チェック例外

未チェック例外には、この制限は適用されません。これらは、オーバーライドされたメソッドの throw 句で宣言されているかどうかに関係なく、オーバーライドしたメソッドによってスローできます。

以上がサブクラス メソッドは、スーパークラス メソッドよりも広範囲のチェック済み例外をスローできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート