basyura's blog

あしたになったらほんきだす。

例外

継承関係

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 のサブクラスについては、メソッドの throws 節でそれらを宣言する必要はありません。

RuntimeException

通常使用してるのが 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 の生成はコストが高いので何回も呼ばれるようなところで条件分岐に使用するのは良くないってのはよく言われる。
という、僕の経験値レベルのエントリ。