メソッドの例外宣言のオーバーライドについて
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 サイトの他の関連記事を参照してください。