※前回の講座がまだの人はこちらから
【Java入門⑪】インタフェース ~初心者でも安心!基礎から学べるプログラミング講座~
例外処理
プログラム実行時に、以下の様なエラーが発生したことはありませんか?
これらは、例外的なエラーが発生し、プログラムが異常終了したことを意味しています。
この例外的なエラーのことをExceptionと言います。
例外処理とは?
例外処理とは、コンパイル時に回避できないエラーを検知し、例外が発生した際の処理をあらかじめ記述するためのものです。
この例外処理を書いていない場合は、例外が発生した時に上の様なエラーになるため、プログラムが異常終了します。
例外処理を用いて、例外発生後の処理を記述していると、プログラムを異常終了させることなく動作させることが可能になります。
例外処理の使い方
例外処理の構文
例外処理は、try~catch文を使って記述します。
tryの中に実行したい処理を書きます。そのtry内で例外が発生した場合、tryの処理を中断して、catchへ行きます。finallyが書いてあれば、tryもしくはcatchの処理が終わった後に、finallyの処理が実行されます。(finallyは書かなくても問題ありません。)
try {
例外が発生しうる処理;
} catch (例外クラス名 変数名) {
例外発生時の処理;
} finally {
例外発生有無に関わらず必ず動作する処理;
}
catchで指定する例外クラス名は、tryで発生するであろう例外のクラス名を指定します。変数名に関しては、「e」や「ex」を指定することが基本的に多いです。
例外クラスの一例
例外クラス名はいくつか存在し、状況に応じて使い分ける必要があります。
クラス名 | 概要 |
Exception | 何らかの例外 |
IOException | 不正な入出力 |
IndexOutOfBoundsException | 範囲外 |
ArithmeticException | 不正な算術計算 |
NullPointerException | Nullアクセス |
IOExceptionクラス〜NullPointerExceptionクラスは、Exceptionクラスを継承しています。
また、Exceptionクラスを継承することで、独自の例外クラスを作成することも可能です。
Exceptionクラス
例外クラスが継承しているExceptionクラスには、便利なメソッドが用意されています。
メソッド名 | 概要 |
getMessage() | エラーメッセージを取得する。 |
printStackTrace() | スタックトレース(※1)の内容を取得する。 |
catchした時にgetMessage()を呼び出して、エラーメッセージを出力することが多いです。
(※1)
スタックトレースとは、「メソッドがどの順番で呼び出され、どこで例外が発生したかが記録された情報」のことを指します。
例外を投げる
例外は基本的に発生してしまうものですが、意図的に例外を発生させることができます。一般的には、「例外を投げる」と言います。
throw new 例外クラス名(“メッセージ“);
throwで例外クラス名を指定することで、例外を投げてくれます。Javaでは例外になってくれない場面だが、例外を投げたい時に使います。メッセージは、必要な場合のみ記述すれば良く、該当の例外クラスへメッセージを投げることができます。
例外処理の実行
try~catch文を用いて、例外処理を書いてみます。
<使用例>
public class Ex1 { public static void main(String[] args) { System.out.println("プログラムの実行"); try { System.out.println("NullPointerExceptionを意図的に発生"); throw new NullPointerException("ぬるぽ発生"); } catch(NullPointerException e) { System.out.println(e.getMessage()); System.out.println("NullPointerException発生"); } catch(Exception e) { System.out.println(e.getMessage()); System.out.println("Exception発生"); } } }
<実行結果>
tryの中へ入り、意図的に例外を発生させるためにNullPointerExceptionをthrowしました。
結果、Exceptionではなく、NullPointerExceptionでcatchされて、その中の処理が実行されました。
例外の発生タイミング
処理がどこまで行われているのかによって、どこで例外が発生したのかを予想することができます。
<使用例>
public class Ex2 { public static void main(String[] args) { System.out.println("プログラムの実行"); try { System.out.println("IndexOutOfBoundsExceptionを意図的に発生"); int[] a = new int[2]; for(int i = 0; i <= 2; i++) { a[i] = i; } System.out.println("例外発生せず"); } catch(NullPointerException e) { System.out.println(e.getMessage()); System.out.println("NullPointerException発生"); } catch(Exception e) { System.out.println(e.getMessage()); System.out.println("Exception発生"); } } }
<実行結果>
今回は、IndexOutOfBoundsExceptionが発生するプログラムを書きました。配列の長さより多くfor文を回すことで、例外が発生します。例外が発生した時点で、catchの方へ処理が飛ぶので、「例外発生せず」のメッセージは表示されません。
さらに、IndexOutOfBoundsExceptionでcatchする処理が書かれていない為、Exceptionでcatchされます。
まとめ
Javaでは、様々なエラーを例外として捉える為、例外処理を頻繁に使用します。
どの様な処理で例外が発生しうるのか、最初は判断つかないかもしれませんが、少しずつ慣れていってください。