アサーション

・アサーションはJ2SE1.4で導入されたキーワードassertを使って実装する。
・アサーション機能はコンパイル時および実行時にオンまたはオフにすることができる。
・アサーションを使用する構文は次のようになる:
 assert 条件;
 assert 条件:式;
 条件は値としてboolean値をとり、検証したい条件を記述する。エラーメッセージを送る場合は式を使う。
・アサーションがコンパイル時および実行時にオンとなると、条件が評価される。条件がtrueの場合、assert文は何も処理せず、そのままプログラムが実行される。しかし、条件がfalseの場合はAssertionErrorがスローされる。式が指定された場合は、AssertionErrorのコンストラクタに渡されて、エラーメッ セージとして使用される。

<ソースの例>
public class Sample7_6
{
  public static void main(String args[]){
    int x = 15;
    DataAccess da = new DataAccess();
    assert da.dataIsAccesible():Data is not acceptable;
    System.out.println(Value of x: + x);
  }
}
class DataAccess
{
  public boolean dataIsAccesible(){
    return false;
  }
}
<実行例>
$ javac -source 1.4 Sample7_6.java
$ java -ea Sample7_6
Exception in thread main java.lang.AssertionError: Data is not acceptable
at Sample7_6.main(Sample7_6.java:6)
注.コンパイラオプションの「-source 1.4」はJ2SE 1.4では必要だったが、JDK5以降の環境では不要となる。ただし、アサーションはプログラムの実行時はデフォルトでオフのため、「-ea(-enableassertions)」オプションを指定して実行する。

・アサーションをアプリケーション内の特定のクラスにのみオンすることもできる:
 java -ea:クラス1 -ea:クラス2 アプリケーション
・アサーションを「-da(-disableassertions)」オプションを使ってアプリケーションでオフにすることもできる:
 java -da アプリケーション

・オプションを複数つけた場合、一般には先に記述したものよりも後に記述したものが優先される。ただし、例えば「java -da:Test -ea AssertSample」と実行した場合には、-da:Testを先に記述しているが、Testクラスのアサーションを無効にするという詳細なレベルの設定をしているため、後に記述されたアサーションの有効よりも優先される。

・アサーションエラーに対して、例外処理は行わない(例外処理してはアサーションの意味がない)。

<アサーションを使用すべきではない状況>
・publicなメソッドに渡す引数のチェックにアサーションを使ってはならない。これには2つの理由がある:
 - 引数チェックが必要な場合は、メソッド仕様の一部でなければならないと同時に、メソッドの動作の一部にしなければならない。アサーションはアプリケーションの実行時にオンになるとは限らない。
 - 間違った引数を渡すと、IllegalArgumentException, IndexOutOfBoundsException, NullPointerExceptionなど、具体性の高い適切な実行時例外が発生 する。つまり、コマンドライン引数のチェックにもアサーションを使ってはならない。
・アプリケーションが必要とする適正な操作を強制的に適用するためにアサーションを使ってはならない。
・アサーションが有効または無効であるかどうかによってアプリケーションの動作が変わるようになってはならない。

投稿者 java

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です