例外(Exception)とは、エラーなど通常の動作以外の動作と言う意味で、
それが発生して投げ(throw)られると、そのプログラムの流れを中止します。
例外も全てオブジェクトになっています。
以下に過去に出現したことがありそうな例外クラスの概要を示します
例外クラス名 | 概要 |
---|---|
NumberFormatException | 数字並びの文字列を数値に変換する時、変換できない文字を含む場合に投げ(throw)られます |
IndexOutOfBoundsException | 存在しない配列の添え字を使った時に投げ(throw)られます |
Exception | ほとんどの例外クラスのスーパークラス |
FileNotFoundException | FileInputStreamなどで、ファイルを開く処理をした時ファイルが存在しない時に投げ(throw)られます |
IOException | 入出力で失敗した場合に時に投げ(throw)られます |
EOFException | ストリーム終端後の入力により、エラーで投げ(throw)られます |
ClassCastException | キャストしても実体と合わない場合に、エラーで投げ(throw)られます |
これら例外関連のクラスの構造を示します。(一部の例外クラスです)
各例外クラスの詳細を下のリンクで確認しましょう。
例外の発生箇所では、対応する例外クラスのオブジェクトが生成され、
それがthrow というキーワードで投げられています。
以下に実際に例外オブジェクトを投げるthrowで、
プログラムを中断させる例を示します。
public class Test{ public static void main(String[] arg){ test(); System.out.print("main 終了"); } public static void test() { boolean b = true; if (b) throw new RuntimeException("例外テスト"); System.out.print("testリターン"); } }
以下に、コンパイルし、実行する例を示します。
メソッドにthrowsの指定がなくてもコンパイルエラーになっていないのは、
throwしているのが、
RuntimeExceptionの非チェック例外クラスのオブジェクトだからです。
throwの実行でプログラムが中断されて、『testリターン』や『main 終了』を表示することはありません。
D:\java>javac Test.java D:\java>java Test Exception in thread "main" java.lang.RuntimeException: 例外テスト at Test.test(Test.java:11) at Test.main(Test.java:5) D:\java>
以下で別のExceptionオブジェクトを投げる(throw)例を示します。
public class Test{ public static void main(String[] arg) throws Exception { test(); System.out.print("main 終了"); } public static void test() throws Exception{ boolean b = true; if (b) throw new Exception("例外テスト"); System.out.print("testリターン"); } }
こんどは、Exceptionのオブジェクトを投げ(throw)ています。
これは、チェック例外クラスなのでthrows Exceptionの部分がないと、
Test.java:5: 例外 java.lang.Exception は報告されません。スローするにはキャッチまたは、
スロー宣言をしなければなりません。のコンパイルエラーが指摘されます。
このようにRuntimeException及びその継承クラス以外のException継承オブジェクトをthrowする部分は、
tryブロックで囲んでcatchで捕らえる記述をするか、
またはメソッドの外へthrowsすることで外部に任せる記述を書かなければなりません。
上記例はthrowsしている例という訳です。
この例外に対応するプログラムが書いてあれば、
実行の流れを例外処理部に移動します。
移動すると言うことは、見えないgoto文やreturn文がある。・・と考えると分かりやすいでしょう。
以下にコンパイルして、実行する例を示します。
D:\java>javac Test.java D:\java>java Test Exception in thread "main" java.lang.Exception: 例外テスト at Test.test(Test.java:11) at Test.main(Test.java:5) D:\java>
上記実行で分かるようにthrowの実行でプログラムが中断されて、 『testリターン』や『main 終了』が表示されていせん。