10月31日の学び②

  • エラーと例外は違う。
  • エラーや例外の実体はインスタンス
  • 「エラーが発生してプログラムが強制終了」「例外が発生してプログラムが強制終了」「例外が発生したがプログラムは強制終了しない」の3通りがあることを意識。

Javaの例外概要(大切)

土台としてエラーと例外の2つあることを意識

  • Error:回復の見込みがないためJVM側で自動終了する。
  • Exception:2種類ある。

エラー

  • java.lang.OutOfMemoryErrorのメモリ不足時など。
  • ログさえ出せないので直ちに停止するべき。
  • すべてcatchして処理するのが常に正しいわけではない

検査例外

  • コンパイラコンパイル時にチェックする例外。例外処理の実装がないとコンパイルに失敗する。
  • FileNotFoundExceptionやSQLExceptionなど。
  • アプリケーション側ではファイルがなかったりした場合はどうしようもない。この例外が発生した場合に責任はアプリケーション側にはない。
  • アプリケーションには責任はないが発生する可能性はあるので処理が必要な場合に用いる。
  • 検査例外を使えば堅牢なアプリケーションとなるが、あちこちに例外処理のthrow/catchが散在する。

実行時例外

  • コンパイラがチェックしない例外。例外処理の実装がなくてもコンパイルに成功する。
  • NullPointerException やIndexOutOfBoundsException。
  • アプリケーションのバグが原因なので、この例外が発生した場合には責任はアプリケーション側。
  • catchを実装してもしなくてもよい。

https://camo.qiitausercontent.com/acf6ba79ca9ccc838f13a49b1a436cc0a91a58db/687474703a2f2f7777772e6a617661726f61642e6a702f696d616765732f657863657074696f6e322e676966

www.milk-island.net

qiita.com

実装例

例外の上位へのスローと自分でのcatchが同居するケースも当然ある。

void doSomething() throws MySpecificException {
    try {
        foo();
    } catch (IOException e) {
        throw new MySpecificException("failed my specific task", e);
    }
}