例外の本質は何か

例外関係の話題が冷め切らないうちに、例外の本質に付いて考えてみます。

検査例外と非検査例外の本質は何か

java 以前のプログラムにおいては、例えばセグメンテーション違反を起こした場合にはアプリケーションが異常終了します。
同様に java においても、NullPointerException は catch せず、そのままアプリケーションを終了させることが望ましいと考えられています。これは例外的事象の発生時にアプリケーションを暴走させずに終了状態へと遷移させることで、その後に予期せぬ挙動を起こすことを防ぐためです。

  • NullPointer は「セグメンテーション違反」と同様の使い方が想定される

一方、IOException のような入出力関連の例外に目を向けると、C では「ファイルハンドラが NON-NULL か否か」について条件分岐を行い、NULL 時にはエラー処理を行うことが望まれます。しかし正常フローは「ファイルが正常に開け、正常に入出力が行える」という流れなので、その他のエラー処理は例外的事象となります。

  • IOException は、ファイルが開けなかった際のエラー処理に使われる

「例外」の本質としては、こんな具合だと思っています。

  • NullPointerException に代表される非検査例外は、例外的事象が発生したときにシステムを落とすために使われる
  • IOException に代表される検査例外は、例外的事象が発生したときにエラー処理を行うために使われる

ちなみに検査例外の発生時にチェックを強制するならば java に、しないならば C# になる、と。


なんとも教科書的な答えだなぁ。
個人的には、チェック強制が要るか要らないかは些細な悩みだと思っている。チェック強制のメリットデメリットがあるし、その逆ももちろんある。本質的な違いはそんなところには無いと思うんだけどね。