Javaのメソッドオーバーライドにおける例外処理のルールとは?
メソッドオーバーライドで例外処理だけを変更できるのか?
結論から言えば、はい、可能です。Javaでは、メソッドをオーバーライドする際に、例外処理のみを変更することが認められています。ただし、それには守るべきルールが存在します。本記事では、そのルールをわかりやすく解説します。
ルール1:非チェック例外は自由にスローできる
オーバーライドする側のメソッドは、親クラスのメソッドが例外をスローするかどうかにかかわらず、任意の非チェック例外(Unchecked Exception)、つまり RuntimeException およびそのサブクラスをスローすることができます。
ルール2:新しい、またはより広範なチェック例外はスローできない
一方で、オーバーライドするメソッドは、親クラスのメソッドで宣言されたチェック例外に対して、まったく新しいチェック例外や、より広範なチェック例外をスローすることはできません。これは、ポリモーフィズムを利用して親クラス型の変数経由でメソッドを呼び出すコードが、親クラスの宣言に基づいて例外処理を記述しているためです。この制約を破るとコンパイルエラーとなります。
ルール3:より狭い、またはより少ない例外ならスローできる
オーバーライドするメソッドは、親クラスのメソッドが宣言している例外よりも狭い範囲の例外(サブクラスの例外)や、より少ない種類の例外をスローすることが許されています。さらに、まったく例外をスローしないようにすることも可能です。
コード例で確認しよう
import java.io.*;
class Parent {
void readFile() throws IOException {
System.out.println("親クラスのメソッド");
}
}
class Child extends Parent {
// OK: IOException より狭い FileNotFoundException をスローできる
@Override
void readFile() throws FileNotFoundException {
System.out.println("子クラスのメソッド");
}
}
この例では、親クラスが IOException を宣言しているため、子クラスはそのサブクラスである FileNotFoundException をスローできます。逆に、Exception のようなより広い例外や、SQLException のような無関係なチェック例外を宣言するとコンパイルエラーになる点に注意してください。
まとめ
メソッドオーバーライドにおける例外処理の変更は、次の3つのルールに従えば自由に行えます。
- 非チェック例外は、条件に関係なく自由にスローできる
- 親メソッドより新しい、または広範なチェック例外はスローできない
- 親メソッドより狭い、または少ない例外ならスローできる
これらのルールを正しく理解しておくことで、安全性と保守性の高いオーバーライド設計が実現できます。
-
Javaのメソッドオーバーライドとは?仕組みとサンプルコードを解説
オーバーライドとはオーバーライド(Override)とは、サブクラスが親クラスから継承したメソッドを、自身の要件に合わせて再定義できる機能です。これにより、サブクラスはその型に固有の振る舞いを実装することができます。オブジェクト指向の観点で言えば、オーバーライドとは「既存のメソッドの機能を上書きする」ことを意味します。オーバーライドの例具体的な例を見てみましょう。以下のコードでは、Animal クラスの move() メソッドを、Dog クラスがオーバーライドしています。class Animal { public void move() {&nbs
-
Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで
Rails開発者なら、Railsコンソールを頻繁に使う方も多いのではないでしょうか。そして今や、RailsコンソールといえばPryが定番。素のIRBと比べると、その使い勝手は段違いです。 実はPryには、例外を扱う際に非常に便利な機能が標準で組み込まれています。この記事では、その中でも特に役立つ3つの機能を紹介します。 直近の例外の完全なバックトレースを表示する Pry(IRBでも同様)で例外が発生すると、通常は短縮されたバックトレースが表示されます。多くの場合それで十分ですが、詳細を確認したい場面もありますよね。 そんなときは wtf -v コマンドを使いましょう。直近の例外の完全な