継承関係
java.lang.Object +-- java.lang.Throwable +-- java.lang.Error +-- java.lang.Exception +-- java.lang.RuntimeException
Throwable
Throwable クラスは、Java 言語のすべてのエラーと例外のスーパークラスです。このクラス (またはそのサブクラスの内の 1 つ) のインスタンスであるオブジェクトだけが Java 仮想マシンによってスローされるか、Java の throw 構文によってスローされます。
Throwable
Error
Error は Throwable のサブクラスで、通常のアプリケーションであればキャッチすべきではない重大な問題を示します。そうしたエラーの大部分は異常な状態です。
Error
Exception
Exception クラスとそのサブクラスは、通常のアプリケーションでキャッチされる可能性のある状態を示す Throwable の形式の 1 つです。
Exception
RuntimeException
RuntimeException は、Java 仮想マシンの通常の処理でスローすることができる各種の例外のスーパークラスです。
RuntimeException
メソッドの実行中にスローされるがキャッチされない RuntimeException のサブクラスについては、メソッドの throws 節でそれらを宣言する必要はありません。
通常使用してるのが Exception と RuntimeException の独自サブクラス。ぼんやりとした使い分けとしては
Exception のサブクラス
結果ステータスを変更する代わりに例外を投げて処理を分岐したい場合に使ったりする。
try { ・・・ } catch(UserNoExistException e) { // ユーザが存在しない場合の処理 } catch(PasswordIincompatibilityException e) { // パスワードが一致しない場合の処理 }
RuntimeException のサブクラス
渡された値が null とかどう考えても変な値だったりして、おかしなデータを保存されても困る場合にユーザ操作自体を止めてしまう目的で使ったりする。
if(param == null) { throw new ParameterExeption("null がくるはずありません"); }
Throwable , Error , Exception , RuntimeException って有るけど、厳密にこの場合は何を使うとかまじめに考えてる人はそんなに居ないのではないかと。Exception だとキャッチしないといけなくてウザいから RuntimeException にしとこう程度のゆるさ。むやみやたらに try catch しまくってる人もいるけど・・・それば別として。
Throwable と Error はフレームワーク側の処理で見るけど、それにのっかる業務アプリは使ってないんじゃないかなぁ。
あとは、Exception の生成はコストが高いので何回も呼ばれるようなところで条件分岐に使用するのは良くないってのはよく言われる。
という、僕の経験値レベルのエントリ。