JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > アサーション編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  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