🦁

検査例外と非検査例外

2023/12/12に公開

検査例外と非検査例外の違いを聞かれて即答できなかったので、改めて調べたまとめを記載します。

Javaの初心者で検査例外と非検査例外の違いがよくわからない方向けの記事になります。

Throwableクラス

Javaのエラー、例外に関するクラスは全て Throwableクラス クラス配下にあります。

ThrowableクラスのサブクラスとしてErrorクラスExceptionクラスがあります。

ExceptionクラスにはサブクラスとしてRuntimeExceptionクラスとその他のクラスである検査例外に分類されます。

RuntimeExceptionクラスに属するクラスはすべて非検査例外となります。

上記を一目でわかるように図示すると、以下です。

検査例外非検査例外.png

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