アサーションとは、プログラムの正しい動作を保証するためのチェックを行うための機能です。
プログラムが、仕様通り条件が成り立つはずの箇所にアサーションチェック用のコードを入力した場合、真であった場合は何も起こりませんが、その条件が偽であった場合、AssertionError例外がスローされます。
1 2 3 4 5 6 7 8 9 |
class AssertSample{ public static void main(String[] args){ AssertSample as = new AssertSample(); as.calc(-1); } private void calc(int num){ assert(0 <= num); } } |
ここでは、AssertSampleクラスのcalc()メソッドを呼び出す際の引数が0以上かのアサーションチェックを行います。
0以上であれば何も起こらず、そうでなければ例外が発生します。
アサーションチェックは、上記サンプルコードの8行目で行っており、-1を渡しています。
アサーションを有効にするには、-eaオプションを使用します。使用しない場合、アサーションコードは無視されます。
アサーションを有効にして実行結果を確認します。AssertionError例外が発生しました。
AsserionErrorクラスは、Errorクラスのサブクラスです。Errorクラス系の例外は致命的例外ですので、try~catchのような例外処理コードは不要です。AssertionError例外がスローされないようにプログラムを修正する必要があります。
アサーション機能を利用する際の構文を確認します。
アサーション式
①assert 条件式; ②assert 条件式: 式; |
if文の()と同じように、条件式にはboolean値にする必要があります。
②の「式」には、値を返さないものを記述することはできません。
(例えば②の「式」で戻り値を返さないメソッドを呼び出しても、実行できないので記述できません。)
1 2 3 4 5 6 7 8 9 10 |
class AssertSample2{ public static void main(String[] args){ AssertSample2 as = new AssertSample2(); as.calc(-1); } private void calc(int num){ assert(0 <= num):method(); } private void method(){System.out.print("実行できません");} } |
1 2 3 4 5 6 7 8 9 10 |
class AssertSample2{ public static void main(String[] args){ AssertSample2 as = new AssertSample2(); as.calc(-1); } private void calc(int num){ assert(0 <= num):method(num); } private String method(int num){return "値は" + num + "です";} } |
②の構文で、戻り値のある式を指定した場合、エラーメッセージと共に出力されます。
アサーションを利用する際の注意
アサーションの実行を正常動作の一部とするようなプログラムは書くべきではありません。
例えば、エンドユーザの入力チェックでは、どのような値を入力されても対応できるようにするために、適切な例外処理を行う必要があります。また、アサーションはプログラムにバグを残さないための1つの手法なので、作成したプログラムをリリースする段階では、AssertionErrorがスローされないようになっている必要があります。したがってAssertionErrorをスローされることを見越してcatch句で受け取ることなどは、アサーションの目的にそぐわないことになります。