概要
assert
文にはコードを書く際に想定している前提条件を指定する- コード実行時、VMの引数に
-enableassertions
を指定する(指定しないと無視される) - 前提条件に合わない場合、
AssertionError
が発生する - エラー時のメッセージを追加することができる
- privateメソッドで想定している引数チェックなど、開発時のデバッグに用いる
- publicメソッドの引数チェックのような、運用時の動作保証に対しては用いるべきではない
基本形
assert
の後に想定条件を書く。実行時引数に-enableassertions
が設定されていて想定条件がfalse
の場合はAsertionError
が発生する。
assert 想定条件;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class AssertTest { public void testAssert() { System.out.println("Result: " + quotient(1.0, 0.0)); } private double quotient(double dividend, double divisor) { assert divisor != 0.0; return dividend / divisor; } public static void main(String[] args) { AssertTest app = new AssertTest(); app.testAssert(); } } |
このコードのquotient()
メソッドは引数dividend
がゼロでないことを想定しているが、これを呼び出すメソッド側でゼロを指定している。
まずこのコードを実行時引数になにも指定しないで通常通り実行すると、以下の様に表示される。
1 |
Result: Infinity |
次にこのコードの実行時引数に-enableassertion
を指定して実行すると、以下のAssertionError
が投げられる。
1 2 3 4 |
Exception in thread "main" java.lang.AssertionError at specification.AssertTest.quotient(AssertTest.java:9) at specification.AssertTest.testAssert(AssertTest.java:5) at specification.AssertTest.main(AssertTest.java:15) |
メッセージ指定形式
以下の形式で、assert
が実行されたときのAssertionError
にメッセージが付加される。
assert 想定条件 : メッセージ;
たとえば先のコードのassert
文を以下の様に変更する。
1 |
assert divisor != 0.0 : "序数にゼロが指定されました"; |
そして実行時引数に-enableassertions
を指定して実行すると、エラー表示が以下の様になる。
1 2 3 4 |
Exception in thread "main" java.lang.AssertionError: 序数にゼロが指定されました at specification.AssertTest.quotient(AssertTest.java:9) at specification.AssertTest.testAssert(AssertTest.java:5) at specification.AssertTest.main(AssertTest.java:15) |
実行時引数の指定
Eclipseで実行する場合は、実行→実行構成のダイアログ→引数タブ→VM引数に-enableassertions
を指定する。
コマンドラインから実行する場合は、コンパイル後のクラスファイルを実行する際に-enableassertions
を指定する。
1 |
> java -enableassertions AssertTest.class |
活用シーン
assert
は分散開発時に担当している処理の前提条件を明確化(通常はコメントにより明示するなど)。
デバッグ時に-enableassertions
を指定してエラー補足・対応、運用時にはオプションを外して実行。
public
メソッドの引数チェックなど運用時の仕様に関する条件は、assert
ではなく条件分岐や例外処理を用いるべき。