|
| |
2002/02/03 田中宏和 |
| Last
Update 2002/11/02 |
|
 |
アサーション編 |
 |
|
| ◆アサーションとは? |
| アサーションとはエラーのないプログラムを作成するための一つの手法です。プログラムの中で、ある条件が成立していなければならない場所に検証用のコードを入れ、その条件に違反している場合はエラーを出力してプログラムの状態をチェックできるようにします。これによってプログラムのバグの修正を助け、より堅牢なプログラムを作成することが可能となります。 |
| ◆ここでの環境 |
| OS |
Windows 2000 |
| J2SE |
1.4.0 |
|
|
|
| ◆構文 |
<構文1>
assert boolean-expression;
boolean-expressionはboolean型の式を指定します。ここにはプログラム実行時にtrueにならなければならない式を入れます。もしfalseになった場合はAssertionErrorがスローされます。
<構文2> assert
boolean-expression: expression;
expressionがAssertionErrorのコンストラクタの引数になります。 |
| |
| ◆使い方 |
<例1>事前条件のアサーションに使用
事前条件とはメソッドのパラメーターが満たすべき条件のことです。
|
private void setData (int data) {
// 事前条件のアサーション
assert data > 0;
// ここはこのメソッドの処理
・・・・・
・・・・・
} |
|
(注意)
publicメソッドのパラメーターの事前条件のチェックにはアサーションを使用しないでください。publicメソッドでパラメーターのチェックを行う場合は確実にチェックを行い、適切な例外をスローしなければなりません。(アサーションを使用した場合、アサーションが有効でないと、パラメーターのチェックが行われなくなってしまう。また、アサーションでの例外はAssertionErrorしかスローされない) |
| <publicメソッドでパラメーターのチェックを行う場合の例> |
public void setData (int data) {
if (data <= 0)
throw new IllegalArgumentException("Illegal data: " + data);
// ここはこのメソッドの処理
・・・・・
・・・・・
} |
|
<例2>事後条件のアサーションに使用
事後条件とはメソッドの処理結果が満たすべき条件のことです。 |
public int culculate(int a, int b) {
// ここはこのメソッドの処理
・・・・・
・・・・・
// 事後条件のアサーション
assert ret > 0;
return ret;
} |
|
<例3>クラス不変条件のアサーションに使用
クラス不変条件とはクラスの内部の状態で不変に保たなければならない条件のことです。 |
/**
* クラス不変条件をチェックするメソッド
*/
public boolean checkData() {
// ここにクラス不変条件をチェックする処理を記述
・・・・・
・・・・・
}
public void culculate(int data) {
// ここでこのクラスが持つメンバ変数になんらかの変更がある
・・・・・
・・・・・
// クラス不変条件のアサーション
assert checkData();
} |
|
| |
| ◆アサーションを使用する場所 |
アサーションはあくまでプログラムの検証用で、業務的なエラーチェックなどの処理ロジックとは違います。ですので、アサーションは「この場所でこの条件がfalseになったらおかしい」と思う場所に検証用として入れるのがよいと思います。
<例1>
valueの値は0より大きくなったらおかしい場合
assert value <= 0; <例2>
valueが0,1,2のいずれかの値しかとらないはずの場合 switch(value) {
case 0:
・・・・・
break;
case 1:
・・・・・
break;
case 2:
・・・・・
break;
default:
assert false;
} |
|
|
| ◆サンプルコード |
| ここでは、わざとfalseを指定してAssertionErrorをスローさせて動きを見てみたいと思います。 |
| HelloWorldAssertion.java(ここからダウンロード) |
class HelloWorldAssertion {
public static void main (String[] args) {
try {
assertionTest();
} catch (AssertionError e) {
e.printStackTrace();
}
}
private static void assertionTest() {
// わざとfalseを指定してAssertionErrorをスローさせる
assert false : "AssertionErrorでHello World";
}
} |
|
|
| ◆コンパイル |
| アサーションを含むコードをコンパイルする場合は、-source 1.4 をオプションに指定します。 |
| コマンドプロンプト |
| C:\作業フォルダ\JavaHello\assertion>javac
-source 1.4 HelloWorldAssertion.java
C:\作業フォルダ\JavaHello\assertion> |
|
| ◆実行 |
普通に実行しただけでは、アサーションは有効になりません。アサーションを有効にするには -ea
をオプションに指定します。 <普通に実行した場合>
|
| コマンドプロンプト |
| C:\作業フォルダ\JavaHello\assertion>java
HelloWorldAssertion C:\作業フォルダ\JavaHello\assertion> |
|
| <アサーションを有効にした場合>
|
| コマンドプロンプト |
C:\作業フォルダ\JavaHello\assertion>java
-ea HelloWorldAssertion
java.lang.AssertionError: AssertionErrorでHello World
at HelloWorldAssertion.assertionTest(HelloWorldAssertion.java:11)
at HelloWorldAssertion.main(HelloWorldAssertion.java:4)
C:\作業フォルダ\JavaHello\assertion> |
|
| おおおお!エラーが表示されましたね! |
| |
| 参考URL |
| http://java.sun.com/j2se/1.4/docs/guide/lang/assert.html |
■書籍
Java関連の書籍 |
|
| |
|
| |
| ツールの部屋
- Java関連の書籍 - デザインパターン - 情報交換掲示板
- HOME |