検査例外・非検査例外とは
検査例外
検査をしなくてはいけないもの
非検査例外
検査をしなくても良いもの
一括りにするとざっくり「異常や例外」です。
下記のように継承関係があります。
Object
//↑
Throwable
//↑ ↑
Error Exception
// ↑
RuntimeException
まず、大きく分けて「Error」かそうではないかに分けられます。
Errorはプログラムから回復不可能なエラーのことを言います。「プログラムで対処する」ことを求められていません。
逆に言えばError以外はプログラムの中で対処することが求められているエラーです。
以上を踏まえた上で以下のように分けられます。
「Error」「Exception」「RuntimeException」に分けられます。
それぞれエラー、検査例外、非検査例外を表します。
Exceptionの一部(RuntimeException以外)は"検査例外"
☆「Exception」はtry~catchなどで囲む。throws句で宣言をする。
【Exception 例】
・IOException
・SQLException
・ClassNotFoundException
RuntimeException"非検査例外"
☆「RuntimeException」とそのサブクラスは非検査例外でありtry~catchを強要されることはない。
【RuntimeException 例】
・ClassCastException
・NullPointerException
・ArrayIndexOutOfBoundsException
Errorとは
☆「Error」はプログラムではどうしようもなく回復不可能なエラーが出てしまった時。「実行マシンのメモリが不足」「ディスクに対する読み込み、書き込みの権限が不足」「ネットワークの接続ができない」
【Error 例】
・StackOverflowError
・OutOfMemoryError
・UnknownError
ただプログラムでの対処が求められていないだけで任意で例外処理を行なっても良いのです。
まとめ
エラーをまず「プログラムでの対処」が求められているか、求められていないかで分ける。その中で「プログラムでの対処が求められている」ものを更に検査例外(try~catchが必要)か非検査例外(必要ではない)かに分ける。その分け方ができるようになれば知識として定着するはずです。
プログラムでの対処を '求める' か '求めない' か
↓
【Error】【Error以外】
↓
try~catchが '必要' か '必要でない' か
↓
【Exception】【RuntimeException】
必要↑ 不必要↑
最初はこういう風に段階に分けてエラーを分けていくのが良いと思いました!
私も最近ようやく理解しましたが、、、笑