- ベストアンサー
Javaの自作例外クラスについて
Javaの自作例外クラスについて質問です。 Javaでは例外クラスを自作することが可能ですが、 その際に親クラスとして、ExceptionかRuntimeExceptionを継承する必要があります。 ここで、この二つのクラスのうちどちらを継承させた方が良いのでしょうか? それぞれのメリット・デメリットまたは用途などをご教授願いますでしょうか。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
一言で言いますと、Exceptionを継承した場合は例外処理がコード上義務付けられるのに対して、RuntimeExceptionを継承した場合はそれが必須ではなくなるという違いがあります。 そしてExceptionの場合には、throws節でその例外を含む型の宣言をするか、もしくはtry-catchで処理する必要があります。この二つはどちらを使用しても大丈夫(コンパイルエラーにならない)なのですが、前者は具体的な例外処理を『呼び出し先にたらい回しして自身ではやらない』場合に使い、後者はそこで直ちに具体的例外処理のコードを書くのに使用します。 どの場所で最終的な例外処理のコードが書かれるべきかは、クラス設計いかんによりますので、場合によって使い分けるべきだと思います。 あと、実際的問題として、RuntimeExceptionのサブクラスにすると例外処理をしなくて楽なのでそうしがちですが、なんでもかんでもRuntimeExceptionのサブクラスとするのは、一応邪道でしょう。何か例外処理を免除したい特別の理由がないかぎりは、特定のクラスやパッケージに固有の例外は、原則としてExceptionクラスのサブクラスとすべきでしょう。 例:throws節 void someMethod() throws SomeException { // some process } 例:try-catch構文 void someMethod() { try { // some process } catch (SomeException e) { // some error handling } }
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
Exceptionを継承した例外クラスだと、メソッドがこの例外を出す可能性がある場合はメソッドの宣言にthrows節が必要ですし、受ける側のメソッドもtry-catchで受けるか更にthrows節で同例外を生起する可能性があることを宣言しなければいけません。 RuntimeExceptionを継承した例外クラスについてはこのような宣言が必要ありません。 原則として呼び出し側メソッドで解決して外側に伝搬させないべき例外はExceptionを継承し、呼び出し側メソッドでは解決しにくく何段階にも渡って外部へ伝搬しなければいけない例外はRuntimeExceptionを継承するべきでしょう。 特に発生したらプログラムを終了させるしかないような例外はRuntimeExceptionで良いでしょう。
お礼
プログラミングでは解決できないような例外は、RuntimeExceptionを継承すべきということですね! 勉強になりました。 ありがとうございます。
- noboru2000
- ベストアンサー率33% (47/140)
親クラスは Throwable ならば throw は出来るんじゃないですか? で、Exception の方は全ての例外の親となるクラス(Errorの方は全てのエラーの親となるクラス)で、RuntimeException も Exception を継承したクラスのうちの一つです。 見ただけで意味が分かるようにするために RuntimeException (実行時例外) という名前のクラスを作ったんだと思いますよ。Exception (例外) だけではどんな例外かがよく分からないからです(他のもそうだと思います)。 ということで詳細は java.lang.Thurowable のドキュメントを読んで下さい。
お礼
ありがとうございました! java.lang.Thurowable のドキュメントを読んでみます。
お礼
基本はExceptionを継承し、後処理を行った方が良いということですね。 それに対しRuntimeExceptionの場合は、特例・もしくは回復不能なエラーの場合にのみ使用ということですね。 確かにこの点に関しては、クラス設計に依存すると思いますので、Exception,RuntimeExceptionを使い分けるよう再度考えたいと思います。 丁寧な説明、ありがとうございました。 また何かありましたら、よろしくお願いします。