これまでに作成したプログラムの中には、ビルドエラーにはならないものの、実行時にプログラムが強制終了してしまうものがありました。プログラムが強制終了する理由には、「エラーが発生した」か「例外が発生した」のどちらかが該当します。
ここで注意しなければならないのは、Javaにおいては、「エラーが発生する」こと、「例外が発生すること」、それから「プログラムが強制終了すること」とでは、意味が異なるということです。これらの用語は区別しなければなりません。
まず、「プログラムが強制終了すること」については、「エラーが発生するとプログラムが強制終了する場合がある」、また「例外が発生するとプログラムが強制終了する場合がある」という関係になっています。そして、エラーと例外については、以下のように言葉の定義が分けられています。
さらに、例外は以下の 2種類に分類されます。
今のところは「エラーと例外とは異なるものだ」と理解していただければ大丈夫です。
エラーは、Java仮想マシンでは手に負えないような異常な出来事が発生してしたことを表します。そのため、プログラムが強制終了することは致し方ないということになります。
エラーも、後述する try catch構文を用いて捕捉することは「文法上は」可能ですが、現実には、捕捉したところでどうにもならないため、try catch構文を使用することはありません。
例外については、「例外の発生」が即「プログラムの強制終了」とはならないための仕組みが用意されています。例外が発生したときに、それを捕捉し、各種の処理を行うための構文がtry catch構文です。大まかな構文の構造は以下の通りになります。
try { ; // 例外が発生するかもしれない処理 } catch(Sample1Exception e) { ; // Sample1例外が発生したときの処理 } catch(Sample2Exception e) { ; // Sample2例外が発生したときの処理 … } finally { ; // 必ず行う処理 }
このうちtry, catch, finallyは予約語になります。なお、finallyについては後の節で解説します。
なお、本章では例外を受け取る側と例外を投げる側の両方について解説します。それぞれ関係する予約語は以下になります。
throwはスローと読み、「投げる」という意味です。野球などで使用されるアンダースローとかサイドスロー、サッカーで用いられるスローイングなどのスローです。 catchはキャッチと読み、「捕捉する」という意味です。キャッチボールやキャッチフレーズのキャッチです。なお、この章において投げたり受け取ったりするのは、(ボールではなくて)インスタンスです。
この後の節で、エラーについての概要と、例外を受け取る方法と、例外を投げる方法を学んでいきます。エラーや例外の実体はインスタンスです。インスタンスというからには、元となるクラスがあります。エラーや例外に関するクラスの継承関係を言葉で表すと以下の通りになります。
これらのクラスと、エラー・ランタイム系例外・非ランタイム系例外の関係をイメージとして表すと、以下のような感じです。メソッド・フィールドの記述は省略しています。
これらのクラスについての詳細について気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→Throwableクラス・Errorクラス・Exceptionクラス・RuntimeExceptionクラス。
なお、Throwableはクラスです。後の章で解説するインターフェイスのような名前になっていますが、クラスです。