Java 例外クラスの体系(Exception / Error / Throwable)




いろいろ怒る起こる例外。
起こると困るわけですが、知らないともっと困るわけで。。

では、本題です。

Javaの例外クラスの体系

Javaの場合は、Throwableクラスを基底クラスにして、これを継承したいろいろな例外のクラスが用意されています。
例外を自作する場合でも、これを直接継承することはないにせよ、辿れば基底のクラスはこれになります。

んで、そのThrowable配下にあたる例外の体系はこんな感じになります。

ルートにあたる基底クラスは、さっき書いたThrowable。
Throwableクラスは、名前の通り、スローできる(≒キャッチできる)クラスです。

ここから2つに分かれ、青・緑色のException系統と黄色のError系統。
青・緑色側は、Exceptionから、ちょっと横に枝分かれしている緑色のRuntimeException系統。
大きくこんな感じです。

チルダがついているところは、括弧のようなお目にかかるクラスたちだと思ってくださいw
たとえば、緑色だとNullPointerExceptionとかとか。

んで、何がどう違うの?

Error

まずは簡単なところから。
一番右の黄色がError系統です。
これが起きると無慈悲な不幸が訪れます。厄年かもしれません。

有名なのはOutOfMemoryErrorなわけですが、これらのErrorが起きるとVMは正常に動作していない可能性があります。
つまり、VMレベルで何らかの深刻な問題が起きていて、プロセスが異常な状態になっている(かも)。ということです。
OS側に問題があって、起きることもあります。

というわけで、プログラムでこれをcatchで捕捉しても、あまり意味がありません。

RuntimeException

つぎは、緑色のRuntimeException系統です。
こちらはthrowsを書く必要がない例外たちですね。
つまり、「コンパイル時にはチェックされないものども」とも言えます。

NullPointerExceptionが代表取締役なわけですが、ここの系統は、いつどこで起きるかわからず、常に潜んでいる可能性がある例外です。
プログラムレベルでの多くのバグは、これらが原因になりやすいですねw

Exception

最後が青色のException系統です。緑色のRuntimeException系統は除きます。
こちらは、throws、try-catchを書きなさいと怒ってくれるチームです。
つまり、「コンパイル時にはチェックされるものども」です。

ある程度、例外の発生の予測がつく、予測されている例外シリーズなので、throws、try-catchを書きなさい。ってことですね。
ま、書かないといけないとなると多少は身構えるので、意外とバグにはつながらない部分かもです。

ここの派閥がいちばん幅を利かせているわけですが、I/O関連だとFileNotFoundExceptionあたり、データベース関連だとSQLExceptionあたりが有名かな。

例外を自作するならどうする?

アプリを作っていると独自の例外を作りたくなることがあります。

よくあるパターンですが、1つないし2つ。場合によっては、それを継承したものをいくつか作ります。
1つないし2つとは、青色のExceptionを派生したクラス。緑色のRuntimeExceptionを派生したクラスです。

例外を自作したい多くの理由は、例外投げて共通のエラー処理へ飛ばしたいから。ではないでしょうか。
そうなると、青色で用意して、明確に例外を飛ばすようにしとくのが良いのかなーとは思います。

緑色にしとくと、throwsを書かなくて済むメリットはあるわけですが、青色にするのが普通な気はします。