JDK 1.4 から導入された assert を使ったことが無かったので試してみた。


public class AssertSample{
 
  public static void main(String[] args){
 
    try{
      assert false;
    }catch(AssertionError e){
      e.printStackTrace();
    }
 
    try{
      // assert 2つめの式は AssertionError のコンストラクタ引数
      assert false : "契約に違反してますよ";
    }catch(AssertionError e){
      e.printStackTrace();
    }
  }
}

コンパイル時には、-source オプションを忘れずに。
実行時にアサーションを有効にするには、-ea オプションをつける。


C:\>javac -source 1.4 AssertSample.java
C:\>java -ea AssertSample
java.lang.AssertionError
        at AssertSample.main(AssertSample.java:6)
java.lang.AssertionError: 契約に違反してますよ
        at AssertSample.main(AssertSample.java:13)

-source オプションを指定しないと assert に対して以下のように警告が出る。


C:\>javac AssertSample.java
AssertSample.java:6: 警告: リリース 1.4 では
assert はキーワードなので識別子として使うことはできません。

assert を識別子(変数名とか)として使う場合は、-source 1.3 を指定する。

アサーションを無効にするオプション指定
javac -source 1.3 AssertSample.java

アサーションを有効にするオプション指定
javac -source 1.4 AssertSample.java または、
javac -source 1.5 AssertSample.java

J2SE 1.4 では -source 1.3 がデフォルト。
J2SE 5.0 では -source 1.5 がデフォルト。

assert の文法は、以下の2種類。
assert Expression1;
assert Expression1 : Expression2;

Expression1 には、boolean 式。
Expression2 には、エラーの情報となるオブジェクトなど(どんな値でもOK)を指定可能。
Expression1 が true のときに、new AssertionError() や new AssertionError(Expression2) のような感じで処理される。

java.lang.AssertionError の API リファレンスには、

このクラスが提供する 7 つの public コンストラクタ (引数を 1 つ取る) により、呼び出しは宣言エラーを確実に返します。

    new AssertionError(expression)

上記のコードは、expression の型に関係なく、expression の文字列変換を詳細メッセージとして保持します (「The Java Language Specification, Second Edition」のセクション 15.18.1.1を参照)。

と書いてある。
AssertionError のコンストラクタは偉い。7つもコンストラクタを作るとは。
すべてがオブジェクトな言語だったら、こんな苦労しなくて済んだのにね。プリミティブ変数なんてあるおかげで……
って、JDK1.5だった boxing とかあるけど、それ適用されないのかな?

参考: Java 2 SDK ドキュメント V1.4.0 - アサーションを使用したプログラミング

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)