例外・エラーの種類
大まかに二種類
チェックされる例外と、されない例外・エラー
・チェックされる例外は、実装時にコンパイラがチェックするので、catchしていないとEclipse上で赤くなります///
・チェックされない例外・エラーは、コンパイラはチェックしません(文字通りですが...)。なので、catchを書く必要はありません。
・チェックされる例外は、実装時にコンパイラがチェックするので、catchしていないとEclipse上で赤くなります///
・チェックされない例外・エラーは、コンパイラはチェックしません(文字通りですが...)。なので、catchを書く必要はありません。
分類表
type | チェックされる? | 意味 |
---|---|---|
Exception | される | システムの設計の範囲内の異常なイベント |
Error | されない | システムの設計の範囲外の異常なイベント |
RuntimeException | されない | バグ、プログラムの誤り |
クラス階層
Throwable ← Error
↑
└ Exception ← RuntimeException
こんな感じ。
↑
└ Exception ← RuntimeException
こんな感じ。
チェックされない例外・エラーについて
チェックされない例外・エラー(RuntimeError/Error)は、メソッド定義の「throws」で明示的に示す必要がありません。
たとえthrowsで指定していたとしても呼び出し側でcatchする必要はありません。
たとえthrowsで指定していたとしても呼び出し側でcatchする必要はありません。
つまり、 「チェックされない例外」はどのメソッド呼び出しからでも投げられる可能性があるし、どの種類の例外が投げられるかもわかりません。
メソッド側にthrowsがついていればそれを見てはじめてわかりますが、 それ以外が投げられる場合もある でしょう。
メソッド側にthrowsがついていればそれを見てはじめてわかりますが、 それ以外が投げられる場合もある でしょう。
例外・エラーの使い方
上記を踏まえて...
一般的には、
・外部の環境によって生ずるもの:チェックされる例外
・正常なプログラムでは発生しないもの:チェックされない例外
という指針が使われるようです。
一般的には、
・外部の環境によって生ずるもの:チェックされる例外
・正常なプログラムでは発生しないもの:チェックされない例外
という指針が使われるようです。
例外を投げる
例外をメソッドが上位で対応する必要がある場合(そのメソッドをふつうに使用するうえで、起こりうるエラーの状態)は、「チェックされる例外」を投げます。
チェックされる例外は、状況に応じて複数の種類を用意するとよいでしょう。
チェックされる例外は、状況に応じて複数の種類を用意するとよいでしょう。
上位で対応する必要がない場合(インスタンスやクラスの初期化漏れ、範囲外の引数など、明らかに上位側の過失)は、「チェックされない例外」を投げます。
例外を受ける
「チェックされる例外」のみをcatchします。
外部ライブラリなどのメソッドで、「想定内のエラー処理」でも「チェックされない例外」が発生するときは、
その例外もcatchするか、「チェックする例外」で投げなおすようなラッパーを用意します。
外部ライブラリなどのメソッドで、「想定内のエラー処理」でも「チェックされない例外」が発生するときは、
その例外もcatchするか、「チェックする例外」で投げなおすようなラッパーを用意します。
「チェックされない例外・エラー」が発生している時点で異常な状況で、発生すると基本的に処理を続行出来ません。
RuntimeExceptionが出るならメソッド呼び出し側の実装を、Errorなら内容に応じてJVMの設定等を見直します。
RuntimeExceptionが出るならメソッド呼び出し側の実装を、Errorなら内容に応じてJVMの設定等を見直します。
禁則事項
複数種の例外・エラーを、ExceptionやThrowableで受けて一緒くたに処理する/もみ消すというのは、
何が起こっているか把握していないことに対応している、という意味で悪い書き方です。
なるべく避けて、個別の例外に対して処理を書きましょう。
何が起こっているか把握していないことに対応している、という意味で悪い書き方です。
なるべく避けて、個別の例外に対して処理を書きましょう。
例外を分岐・制御構造の代わりに使ってはいけません。ループを抜けたりとかifとして使うとかアリエナス