検査例外と非検査例外
検査例外と非検査例外の違いを聞かれて即答できなかったので、改めて調べたまとめを記載します。
Javaの初心者で検査例外と非検査例外の違いがよくわからない方向けの記事になります。
Throwableクラス
Javaのエラー、例外に関するクラスは全て Throwableクラス クラス配下にあります。
ThrowableクラスのサブクラスとしてErrorクラス、Exceptionクラスがあります。
ExceptionクラスにはサブクラスとしてRuntimeExceptionクラスとその他のクラスである検査例外に分類されます。
RuntimeExceptionクラスに属するクラスはすべて非検査例外となります。
上記を一目でわかるように図示すると、以下です。
Errorクラス
Errorクラスは「プログラムではどうしようもない事態」が起きた際に発生します。
Errorクラスの例としては以下のようなものがあります。
- StackOverflowError(スタック領域のオーバーフロー)
- OutOfMemoryError(メモリの不足)
- InternalError(内部エラー)
- ClassFormatError(クラスファイルの破損、解釈できない)
- UnknownError(未知の重大なエラー)
ただし、これらのエラーはプログラムではどうしようもないものなので、例外ハンドリングする意味がありません。
try-catchを記載しても、catchすることができずにErrorとなります。
では、検査例外と非検査例外の違いを紹介します。
検査例外と非検査例外
非検査例外とは
非検査例外は RuntimeExceptionクラス配下の例外クラスが対象になります。
非検査例外は try-catchが必要ないため、「非」検査例外と言われます。
非検査例外は文法上のエラーはないので、コンパイルエラーにはなりません。
実行時のエラーとして例外メッセージが表示されます。
- NullPointerException(ヌルポ)
- ArrayIndexOutOfBoundsException(配列で存在しない要素へのアクセス)
- IllegalArgumentException(不正な引数をメソッドに渡した)
非検査例外は正しいプログラムを書くことで回避することのできる例外です。
検査例外とは
検査例外は try-catchが必要な例外のため検査例外と言われます。
catch しなければ、コンパイルエラーが発生するため、例外ハンドリングが必須になります。
- IOException(入出力関係の例外)
- SQLException(DB系の例外)
- ClassNotFoundException(クラスが見つからない)
最後に
検査例外と非検査例外はJava特有の仕様です。
ほとんどのプログラミング言語では例外は基本的に全て非検査例外としています。
Discussion