
Javaの例外の種類
まずは、「独自例外」という前に、Javaにはどんな例外の種類があるか振り返っておきましょう。
Javaには、「例外クラス」があり、下記のような継承関係のクラスになっています。
Throwable
全ての例外クラスの親クラスです。何らかの例外を嶋します。
Error
回復の見込みが薄い致命な例外(アンチェック)です。例外処理の必要はありません。(例:OUtOfMemoryError等)、try-catchする必要はありません。
これが発生するということは、アプリケーションは異常な状態になっており、速やかにアプリを停止させるべきです。
Exception(チェック例外)
例外が起きることを想定して例外処理をすべき例外のことです。(例:IOException等)、try-catchしないとコンパイルエラーになります。プログラマ側で例外の発生を防ぐことができないので、必ず例外処理をするようにしましょう。
これが発生しても、プログラムは終了しませんが、エラーが発生しているので基本的には処理を中断させる方が無難です。
throw、thorowsを使って、呼び出し元のプログラムに処理を委託するという書き方が一般的です。
詳しくは下記の記事でも解説しています。
RuntimeException(実行時例外)
必ずしも例外が発生することを想定する必要がない例外のことです。(例:NullPointerException、ArrayIndexOutOfBoundsException等)、try-catchするかは任意ですが、基本的には例えばNullPointerExceptionであれば、if文を使えば例外を回避することができるので、例外処理をするべきではありません。
これが発生したら、強制的にアプリケーションが終了します。
「独自例外」は作った方がよいのか?
通常は、Java標準の例外クラスから、選んで例外を作成するのがよいと思います。
しかし、下記の条件を満たす場合は独自例外を作成してもよいと思います。
- 業務に特化しており、どんなシステムでも汎用的に使える例外処理でない場合(例えば、特定のビジネスロジックや、APIの個別エラーレスポンスを返したい場合など)
- そのアプリで共通の例外処理を作りたい場合
独自例外を導入するメリット
- Java標準の例外クラスと区別することで、実装者が独自例外だけを意識すればよくなる。
- 例外処理が汎用化されて、それだけ直せばいいので、システムの保守性が上がる。
独自例外の作り方
独自例外を作る場合は、2通りの選択肢があります。
- 検査例外を作る。
- 実行時例外を作る。
検査例外を作る。
java.lang.RuntimeExceptionクラスを継承して独自例外クラスを作りましょう。
例
1 2 3 4 5 6 7 8 |
public class ImageException extends RuntimeException { //エラーメッセージを受け取るコンストラクタ public ImageException(String msg) { super(msg); } } |
実行時例外を作る。
java.lang.RuntimeExceptionクラスを継承して独自例外クラスを作りましょう。
昨今の例外
昨今のJava開発で主流になっているフレームワークでは、下記の狙いからかたいてい実行時例外になっていて、フレームワーク側が一手に例外を引き受けます。
よって、プログラマ側で「try - catch」による例外処理をしなくてもよくなっています。
- ソースコードをシンプルにするため。
- 例外ロジックを個々のロジックにいちいち記載しないようにするため。
この記事へのコメントはありません。