try文
例外処理を行うにはtry文を使用します。基本的な書式は次の通りです。
try{ 例外が発生しているかどうか調べる文1; 例外が発生しているかどうか調べる文2; ... } catch (例外クラス1 変数名1){ 例外クラス1の例外が発生した時に行う文; ... } catch (例外クラス2 変数名2){ 例外クラス2の例外が発生した時に行う文; ... }
まずプログラムの中で例外が発生するかどうかを調べる対象の文をtryの後の「{」から「}」までのブロック内に記述します。そして例外が発生した時に行いたい処理をcatchの後の「{」から「}」までのブロック内に記述します。
処理の流れはtryのブロック内で例外が発生すると処理はいったん止まります。そして処理はcatchの箇所へ移ります。Javaでは例外の種類毎にクラスが用意されています。例外が発生すると対応するクラスのオブジェクトが作成され、そのオブジェクトがcatchへ渡されてきます。
渡されてきた例外クラスのオブジェクトがcatchの「(」から「)」の中に記述された例外クラスと一致した場合、変数に渡されてきた例外クラスのオブジェクトが代入され、そしてその後の「{」から「}」の中の処理が実行されることになります。catchは1つのtryに対して複数記述することができますので発生する可能性のある例外について複数のcatchを記述しておき別々の処理を行わせることが可能です。もし発生した例外に一致するcatchが無ければ何も行いません。
catchブロック内に記述された処理が実行されると、try文全体の処理が終了しtry文の次へ処理が移ります。
実際のプログラムにおける例外処理の流れ
言葉で記述すると分かりにくいですが実際のプログラムを例にして確認していきます。次のプログラムを見てください。
int n[] = {18, 29, 36}; System.out.println("開始します"); for (int i = 0; i < 4; i++){ System.out.println(n[i]); } System.out.println("終了しました");
このプログラムを対象にして例外処理を記述してみます。まずは例外処理を行う対象の文をtryブロック内に入れる必要がありますが、例えばプログラム全体をtry文のブロック内に入れることもできます。
try{ int n[] = {18, 29, 36}; System.out.println("開始します"); for (int i = 0; i < 4; i++){ System.out.println(n[i]); } System.out.println("終了しました"); } catch(例外クラス 変数名){ }
この場合、例外処理が終了してtry文の次へ処理が移るとプログラムは終わりなのでプログラムが終了します。
他の方法として例外が発生する可能性がある文だけをtry文の中に入れることもできます。
int n[] = {18, 29, 36}; System.out.println("開始します"); for (int i = 0; i < 4; i++){ try{ System.out.println(n[i]); } catch(例外クラス 変数名){ } } System.out.println("終了しました");
tryブロック内にどの文を入れるのかは例外処理をどのように行うかによって検討する必要があります。今回は例外が発生したら配列要素の出力を終了し「終了しました」と画面に表示させるようにするため次のように記述することにします。
int n[] = {18, 29, 36}; System.out.println("開始します"); try{ for (int i = 0; i < 4; i++){ System.out.println(n[i]); } } catch(例外クラス 変数名){ } System.out.println("終了しました");
次に例外が発生した時の処理を記述します。今回発生する可能性がある例外は「ArrayIndexOutOfBoundsException」という例外です。これは範囲を超えた配列の要素を参照した時に発生する例外です。そこで次のように記述します。
int n[] = {18, 29, 36};
System.out.println("開始します");
try{
for (int i = 0; i < 4; i++){
System.out.println(n[i]);
}
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("配列の範囲を超えています");
}
System.out.println("終了しました");
tryブロック内で例外が発生した場合に、その例外がArrayIndexOutOfBoundsExceptionだとcatchブロック内の処理が実行されます。今回はエラーメッセージを画面に表示させているだけですが、渡されてきた例外クラスのオブジェクトを利用することもできます。これについては別のページで確認します。
例外処理を行うtry文の記述方法と基本的な使い方は以上となります。慣れないと複雑に思えるかもしれませんが何度か記述していると戸惑うことなく記述できるようになります。
サンプル
では簡単な例で試しておきます。
class JSample2_1{ public static void main(String args[]){ int n[] = {18, 29, 36}; System.out.println("開始します"); try{ for (int i = 0; i < 4; i++){ System.out.println(n[i]); } } catch(ArrayIndexOutOfBoundsException e){ System.out.println("配列の範囲を超えています"); } System.out.println("終了しました"); } }
コンパイル後に実行すると次のように表示されます。
例外が発生してもエラーメッセージは表示されずcatchブロック内に記述した処理が実行されています。そしてプログラムも途中で終了することなくtry文以降の文も実行されていることが確認できます。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。