その他
    ホーム 技術発信 DoRuby 【Java】アサーション

    【Java】アサーション

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    最近はRubyで仕事することが増えていますが、最初の案件がJavaだったこともあって、なんとなくJavaに愛着があります。
    自宅で細々と勉強しててみつけた、Javaの「こんなの使うか?」って思った機能?オプション?を紹介します。

    そいつは・・・

    「アサーション」

    Javaプログラムのコンパイル・実行は、windowsだとコマンドプロンプトで行います。
    コンパイルは、
      javac ファイル名(拡張子付)
    実行は、
       java クラス名
    ・・・ですね。

    普段はeclipseなどの統合開発環境を使ってる方が多いと思うので、こういうコマンド類はあまり意識しないかと思います。

    コンパイルや実行などのコマンドにはさまざまなオプションが指定できます。
    実行時に指定できるオプションの1つが「アサーション」です。

    まず、Javaのソースを書きます。

    class Test{
      void method (boolean b){
        assert b: "b is " + b;
        if (b){
          System.out.println("OK");
        }else{
          System.out.println("NG");
        }
      }
    
      public static void main(String args[]){
        Test t = new Test();
        t.method(true);
        t.method(false);
      }
    }
    

    ポイントは3行目です。
    アサーションを使うには、まずプログラムの中にassert文を埋め込んでおく必要があります。
    その構文は以下の2通りです。

     assert boolean式;
     assert boolean式:式2;
    

    boolean式には、プログラム実行時に真になる条件式を書きます。
    条件を満たさない場合はAssertionErrorが発生します。
    また、後者の式では、条件を満たさない場合に式2の結果を出力し、AssertionError発生を知らせます。
    上記のサンプルソースでは、後者の書き方をしています。

    アサーションは、プログラム中に埋め込んだだけでは使えません。
    実行時のコマンドオプションで、使用を指定してやる必要があります。

    実行時オプションは以下のとおりです。

    アサーションを有効にする
    -ea:システムクラスを除くすべてのクラスのアサーションを有効化
    -ea:<クラス名>:指定されたクラスのアサーションのみを有効化
    -ea: ...:デフォルトパッケージとそのサブパッケージに対するアサーションを有効化
    -ea:<パッケージ名>...:指定されたパッケージとそのサブパッケージに対するアサーションを有効化
    -esa:システムクラスのアサーションを有効化
    
    アサーションを無効にする
    -da
    クラスやパッケージを指定したいときは、アサーション有効化オプションと同様に、:でつなげる
    
    実行コマンドの例:java -ea Test
    

    オプションは複数指定できますが(ex::-ea:Test -ea: …)、複数指定すると後から指定したオプションが優先されます。範囲を狭くするようなオプションが先にある場合がそちらが優先されます。

    さて、ここで[-da]を指定して実行してやると、「OK」と「NG」が表示されます。
    アサーションを無効にしているので、当然ですね。

    しかし、[-ea]を指定して実行してやると「OK」と「Exception in thread “Main Thread” java.lang.AssertionError: b is false」が表示されます。
    14行目でmethod()メソッドを呼び出した時に発生しています。

    ・・・とまぁ、このように使います。
    普段eclipseを使っているのでコマンドはほとんど触りません。
    そのため、アサーションの使いどころがいまいちわからないのですが・・・(^^;
    アサーションの使いどころや注意点はありますが、今回は紹介ということで〆させていただきます。