以前、「例外処理について」で例外処理について記述をしたんですが、漠然としていたのともう1回まとめなおしたかったため、メモしておきます。
例外とは?
プログラム実行時に発生するエラーのことであり、例外が起こるとプログラムはここでストップ(強制終了)します。
これを適切に行うことを例外処理といいます。
例外のクラス分け
Javaの例外のクラス分けは下記のようになっています。
- Throwable
- Error
- Exception
- RuntimeException
- RuntimeException以外
以下、説明していきますね。
Throwable
Javaの全ての例外のスーパークラスです。
後に書きますけどこのクラスを継承したりすることはないですね。私は資格試験で勉強するまでは存在をしりませんでした(汗)
Error
unchecked例外といわれ、例外処理自体は任意になります。
エラーの内容はメモリ不足などプログラマが直接対応するのが困難なエラーが該当します。
一例として下記のようなものがあります。
StackOverFlowError
下記のように呼び出し元と定義が一緒で永久ループなどが発生するケースです。
1 2 3 4 |
public method(int a){ a +=1; method(a); } |
NoClassDefFoundError
対象のクラスがないときなどに置きます。
コンパイル時にはあるのに、実行時にライブラリがデプロイされていないときなど。
Exception
一般的なプログラマにとっては例外処理というとこちらのほうが一般的でしょう。
この中でも例外チェックが任意となるRuntimeExceptionとそれ以外に分けられます。
RuntimeException
例外処理が任意のものになります。
下記のものが有名です。
ArrayIndexOutOfException
下記のような存在しないインデックスで配列にアクセスをしたときに発生します。
1 2 |
int[] arr = new int[3]; System.out.println(arr[5]); |
ClassCastException
間違った型変換を行ったときに発生します。
1 2 3 |
List list = new ArrayList(); list.add(10); System.out.println((String)list.get(0)); |
IllegalArgumentException
間違った引数をとったときなどに意図的に投げたりします。
1 2 3 4 5 |
public void method(String a){ if( a == null){ thow new IllegalArgumentException(引数が不足です。); } } |
IllegalStateException
オブジェクトのプロパティのチェックなどに使います。参考リンク参照。
NumberFormatException
整数を表さない文字列を整数に変換しようとしたとき。
1 2 |
String a ="a"; int b = Integer.parseInt(a); |
RuntimeException以外
例外処理が必須となるExceptionです。
下記のものが有名です。
FileNotFoundException
ファイル読み込みなどで該当ファイルがないときにスローされる例外処理です。
ClassNotFoundException
該当するクラスが存在しているかのチェックです。
ケースとしては間違ったパッケージを読み込んでクラスが存在しない時など。
jarファイルをしっかり読み込んでいるかの確認をしましょう。
実務上の注意点
Throwable,Error,Exceptionクラスを継承しない
Errorクラスはアプリケーションでキャッチされるべきでない重大なエラーであり、プログラマが関与すべきエラーではないため。
またThrowable、Exceptionに関してはこれらを継承するとエラーの意味があいまいになるため。
catch句では必ず例外処理をする
ここで例外を握りつぶすと例外が発生したときなどにどこで例外が起きているかわからなくなります。
Finallyで例外をキャッチしない
ここで例外をキャッチするとcatch句を上書きしてしまうため。
NullPointerExceptionは使わない
if( var != null)やOptionalなど通常の条件分岐などで対処できるため。
Finallyブロックに戻り値に影響のある操作はしない
例としてreturnなど。原則として、ストリームを閉じるなど例外の要件にかかわらず行う処理を記述します。