前回に引き続き例外処理です!
■例外クラス
Javaの例外はすべて階層ツリーのクラス、つまり継承関係でまとめられています。
Exceptionというクラスを親として、そこから「RuntimeException」クラスとその他のクラスに分かれ、
さらに「RuntimeException」クラスからはまたサブクラスが派生しています。
前回出てきた「ArrayIndexOutOfBoundsException」や「ArithmeticException」は「RuntimeException」のサブクラスにあたります。
大雑把に言ってしまえば、RuntimeExceptionクラスを継承しているか、していないかの違いです。
では具体的にどのような例外クラスがあるのか、代表的な例を挙げてみます。
■代表的な例外クラス
カテゴリ | クラス名 | 説明 |
---|---|---|
RuntimeExceptionの サブクラス (uncheckedクラス) |
ArrayIndexOutOfBoundsException | 不正なインデックスで要素にアクセスしようとした場合に発生します。 |
NullPointerException | nullが代入されている参照変数に対して、メソッド呼び出しなどを行った場合に発生に発生します。 | |
ArithmeticException | ゼロで除算するなど算術計算で例外的条件になった場合に発生します。 | |
RuntimeException以外のExceptionのサブクラス (checkedクラス) |
IOException | 入出力を行う場合に発生します。 |
ClassNotFoundException | クラス名を表す文字列を引数にメソッドを使用して、クラスを読み込もうとしたが、そのクラスファイルが見つからない場合に発生します。 |
数個だけ挙げてみましたが他にもたくさんあります。
■checked例外とunchecked例外
ではRuntimeExceptionのサブクラスとそれ以外の違いについて説明します。
まず一言でいってしまうと「例外処理が必須か、必須じゃないか」です。
RuntimeExceptionのサブクラスは、例外処理が必須ではありません。
一方それ以外のExceptionのサブクラスは例外処理が必須になります。
前者を「uncheckedクラス」、後者を「checkedクラス」と言います。
「uncheckedクラス」は例外処理の記述は任意ですが、「uncheckedクラス」は例外処理を書かないとコンパイルエラーになってしまいます。
ではなぜ例外処理が必須とそうでないものがあるのでしょうか。
理由は簡単。
uncheckedクラスは原因が「内部」にあります。
つまり、プログラムで例外が発生している箇所を直せば正しく実行することができます。
配列のインデックスが要素外にアクセスしようとしていれば、プログラムを修正すれば例外は発生しなくなりますね。
一方、checkedクラスは原因が「外部」にあります。
つまり、いくらプログラムを修正しようとも自分ではどうしようもないわけです。
これはテキストなどのローカルファイルにアクセスしようとする際に発生したりします。
そのファイルを他で開いていると、Javaからはアクセスできません。
アプリケーションからのアクセスを終了しない限り、Java側ではなす術がないわけです。
■まとめ
- Javaの例外はすべてクラスとしてまとめられている。
- 例外クラスは「checked例外」と「unchecked例外」に分けられる。
- 「checked例外」は外的要因により発生するので例外処理が必須
- 「unchecked例外」は内的要因により発生するので例外処理は任意