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 とかあるけど、それ適用されないのかな?
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)