こんにちは、ともです。
今日は、エラー、検査例外と非検査例外について理解をまとめます。
プログラムでは対処できないようなエラー、そして意図しない処理が発生した場合の例外処理をしっかり理解しないと、品質の高いプログラムを記述することはできません。
JavaSilverの資格にもしっかり乗っているので抑える必要がありますね。
エラーと例外
Javaのプログラム実行中に発生するトラブルは大きく分けて2つの種類があります。
エラー | 実行環境のトラブルなど、プログラムから対処不可能な事態 |
例外 | プログラムから対処可能な事態 |
プログラムから対処できる事態と対処できない事態がある訳です。
例外はさらに、検査例外と非検査例外に分類されます。
検査例外 | 例外処理を記述したかをコンパイラがチェックする例外 |
非検査例外 | 例外処理を記述したかをコンパイラが検査しない例外 |
あるメソッドを記述した時に、例外処理も合わせて実装してあげないと怒られるのが検査例外です。
検査例外が基本です。コンパイラが教えてくれたら、プログラマの記述し忘れが無くなりますよね。
例外クラスは次のようになっています。

以降で実際に確認していきましょう。
エラー
Javaのパッケージ階層図をご覧ください。
Throwableの下にErrorクラスが存在します。
StackOverflowErrorクラスをみてみると、次のように書かれています。
アプリケーションでの再帰の回数が多すぎてスタックオーバーフローが起こる場合にスローされます。
コンパイル時は問題がなかったが、実行してみるとスタックオーバフローが発生しアプリケーションを終了する時のクラスですね。
このようなエラーが発生した場合はアプリケーションを終了させる必要がある為、例外処理のようにcatchして、アプリケーションを止まらないようにする必要はありません。
検査例外
検査例外はコンパイラがチェックする必要がある例外ですね。
Exceptionやそのサブクラスは検査例外となります。
java.sqlパッケージをみてみましょう。
DBに接続する際はおまじないのように記述したtry-catch句。
SQL関係のメソッドは検査例外であるSQLExceptionクラスをthrowする可能性があった為、try-catch句で囲む必要があった訳です。
非検査例外
非検査例外はプログラマが任意で例外処理を記述するものです。
非検査例外はRuntimeExcepitonクラスやそのサブクラスです。
例えば、java.lang.IndexOutOfBoundsExceptionは非検査例外です。
配列の範囲外を参照した時にthrowされます。配列のある要素を参照するコードを記述するたびに例外処理を記述する必要はないですよね。
例外処理を記述するか必要があれば、プログラマは記述するまでです。
まとめ
エラー・検査例外・非検査例外についてまとめました。
しっかり例外処理を記述することができるようになると、プログラムとして成長できた気がしまね。