Java の assert

assert とは

ここでは JDK 1.4 で導入されたアサーション (assertion) の使い方について説明します。

アサーションはデバッグを支援するための機能です。assert ステートメントを使って、記述します。

assert には常に「真 (true) となると想定している式」を書くことによって開発者が何を想定しているか記述できます。

これがどういう意味か、具体例で示します。

assert の使い方

assert に続けて、常に真 (true) であると考えている式と false と評価された場合に表示するメッセージを、コロン : で区切って記述します。

assert 「常に true となると考えている式」: 「メッセージ」;

具体例でみてみましょう。次の例をみてください。

public class TestApp {
  public static void main(String[] args) {

    Person p = new Person(30, "John Doe");

    int age = p.getAge();
    String name = p.getName();

    assert name != null : "Name = (null)";
    assert age >= 0 : "Age is negative.";

    System.out.println(name.toUpperCase() + " - " + age);
  }
}

assert は 9行目と10行目にあります。

assert name != null : "Name = (null)";

このアサーションによって、「ここでは name != null であることを想定している」とか「name が null であることはありえないはずだ」という風に、開発者が考えていたことがわかります。

assert age >= 0 : "Age is negative.";

この記述によって、「ここでは age は 0 であるか、またはそれより大きいしかないはずだ」と、開発者が考えていたことがわかります。

アサーションを有効にするための -enableassertions オプション

アサーションを有効にするには -enableassertions オプションを指定する必要があります。

言い換えれば、オプションを指定しないで実行すると assert は無視されます。

Eclipse での -enableassertions の設定

Eclipse 環境で実行する場合に、アサーションを有効化するには次の場所で VM オプションを渡します。

Run メニューから Run Configurations を選択します。

Arguments タブ内の VM arguments に -enableassertions または -ea を指定します。

IntelliJ での -enableassertions / -ea の設定

IntelliJ では Run メニューの Edit Configurations... から実行オプションの設定画面を開きます。

ここで VM options の設定に assert を有効化するオプション -enableassertions または-ea を設定します。

IntelliJ での assert の有効化

これらを設定することによって、IDE の中でも assert 付きで実行することが可能になります。

assert 使用上の注意

assert はエラー処理ではない

アサートは「エラー処理」ではないので、使い方に気をつけてください。

例えば「ファイルを開く」という動作を行なう場合のことを考えましょう。ご存知の通りファイルを開くという操作は、 開ける場合もあるし、開けない場合も当然想定しなければならないものです。アサートで 「必ずファイルが開けるものと想定した」などと記述するような類のものではありません。

結果をチェックするというようなことは、普通に戻り値をチェックするとか、例外処理をするとかしてください。

assert の有無がプログラムの処理に影響しないようにする

上述の通り assert はアサーションを有効化したときのみ実行されます。そして可能な限りデバッグに有効に使いたいものです。 実行結果は assert の有無によって変わるようなことがないように気をつけなければなりません。

次の例を見てください。

public class AssertTest1 {
  public static void main(String[] args) {    
    int n = 0;
    assert ++n > 0;
    System.out.println("n = " + n);
  }
}

このコードでは、アサートの有効化の有無によって、最終的な n の値が変わってしまいます。通常実行時 (assert 無効) の場合は n は 0 のまま、 アサーション有効化時には n は 1 となります。

アサートが有効化されたときと、されない時でローカル変数の値に変化がないように、気を付けて記述するようにしましょう。

以上、ここでは assert の意味と使い方について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門