工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java アサーション

Java アサーション

このチュートリアルでは、例を使用して Java assert ステートメント (Java アサーション) について学習します。

Java のアサーションは、正しいと想定されるコードをテストすることでバグを検出するのに役立ちます。

assert を使用してアサーションが行われます キーワード。

その構文は次のとおりです:

assert condition;

ここでは、condition プログラムの実行時に true と見なされるブール式です。


アサーションの有効化

デフォルトでは、アサーションは実行時に無効化され、無視されます。

アサーションを有効にするには、以下を使用します:

java -ea:arguments

または

java -enableassertions:arguments

アサーションが有効で条件が true の場合 、プログラムは正常に実行されます。

しかし、条件が false と評価された場合 アサーションが有効になっている間、JVM は AssertionError をスローします 、そしてプログラムはすぐに停止します。


例 1:Java アサーション

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length == 2;
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

出力

There are 3 weekends in a week

このプログラムにはコンパイル エラーがなく、デフォルトでアサーションが無効になっているため、上記の出力が得られます。

アサーションを有効にすると、次の出力が得られます:

Exception in thread "main" java.lang.AssertionError

アサーション ステートメントの別の形式

assert condition : expression;

この形式のアサーション ステートメントでは、式が AssertionError のコンストラクターに渡されます。 物体。この式には、条件が false の場合にエラーの詳細メッセージとして表示される値があります。 .

詳細メッセージは、問題のデバッグに役立つアサーション失敗の情報を取得して送信するために使用されます。


例 2:式の例を使用した Java アサーション

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week";
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

出力

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

上記の例からわかるように、式は AssertionError のコンストラクターに渡されます 物体。想定が false の場合 アサーションが有効になっている場合、適切なメッセージとともに例外がスローされます。

このメッセージは、アサーションの失敗の原因となったエラーの診断と修正に役立ちます。


特定のクラスとパッケージのアサーションを有効にする

アサーション コマンドライン スイッチに引数を指定しない場合、

java -ea

これにより、システム クラスを除くすべてのクラスでアサーションが有効になります。

引数を使用して、特定のクラスとパッケージのアサーションを有効にすることもできます。これらのコマンド ライン スイッチに指定できる引数は次のとおりです。

クラス名でアサーションを有効にする

プログラム Main のすべてのクラスでアサーションを有効にするには、

java -ea Main

1 つのクラスのみを有効にするには、

java -ea:AnimalClass Main

これにより、AnimalClass のみでアサーションが有効になります Main で プログラム。

パッケージ名でアサーションを有効にする

パッケージ com.animal のアサーションを有効にするには およびそのサブパッケージのみ

java -ea:com.animal... Main

名前のないパッケージでアサーションを有効にする

現在の作業ディレクトリで、名前のないパッケージ (package ステートメントを使用しない場合) でアサーションを有効にします。

java -ea:... Main

システム クラスでアサーションを有効にする

システム クラスでアサーションを有効にするには、別のコマンド ライン スイッチを使用します。

java -esa:arguments 

または

java -enablesystemassertions:arguments

これらのスイッチに指定できる引数は同じです。


アサーションの無効化

アサーションを無効にするには、以下を使用します:

java -da arguments 

または

java -disableassertions arguments

システム クラスでアサーションを無効にするには、次を使用します。

java -dsa:arguments

または

java -disablesystemassertions:arguments

アサーションを無効にするときに渡すことができる引数は、有効にするときと同じです。


アサーションの利点

<オール>
  • バグの検出と修正を迅速かつ効率的に行う
  • アサーション チェックは、開発およびテスト中にのみ行われます。これらは、プログラムの実行が遅くならないように、実行時に本番コードで自動的に削除されます。
  • ボイラープレート コードを削除し、コードを読みやすくするのに役立ちます。
  • コードが正しく機能するという確信を高めて、コードのリファクタリングと最適化を行う

  • アサーションを使用する状況

    1.到達不能コード

    到達不能コードは、プログラムを実行しようとしたときに実行されないコードです。アサーションを使用して、到達不能コードが実際に到達不能であることを確認してください。

    例を見てみましょう。

    void unreachableCodeMethod() {
      System.out.println("Reachable code");
      return;
      // Unreachable code
      System.out.println("Unreachable code");
      assert false;
    }
    

    default ケースのない switch ステートメントの別の例を見てみましょう。

    switch (dayOfWeek) {
      case "Sunday":
        System.out.println("It’s Sunday!");
        break;
      case "Monday":
        System.out.println("It’s Monday!");
        break;
      case "Tuesday":
        System.out.println("It’s Tuesday!");
        break;
      case "Wednesday":
        System.out.println("It’s Wednesday!");
        break;
      case "Thursday":
        System.out.println("It’s Thursday!");
        break;
      case "Friday":
        System.out.println("It’s Friday!");
        break;
      case "Saturday":
        System.out.println("It’s Saturday!");
        break;
    }
    

    上記の switch ステートメントは、曜日が上記の 7 つの値の 1 つだけであることを示しています。デフォルトのケースがないということは、これらのケースのいずれかが常に実行されるとプログラマーが信じていることを意味します。

    ただし、仮定が実際に間違っている場合、まだ考慮されていないケースがいくつかあるかもしれません.

    デフォルトの switch ケースに達していないことを確認するために、アサーションを使用してこの仮定をチェックする必要があります。

    default:
        assert false: dayofWeek + " is invalid day";
    

    dayOfWeek の場合 有効な日数以外の値、AssertionError を持っています


    2.仮定の文書化

    根底にある仮定を文書化するために、多くのプログラマーはコメントを使用します。例を見てみましょう。

    if (i % 2 == 0) {
        ...
    } else { // We know (i % 2 == 1)
        ...
    }
    

    代わりにアサーションを使用してください。

    プログラムが大きくなるにつれて、コメントが古くなったり同期しなくなったりする可能性があります。ただし、assert の更新を余儀なくされます。 ステートメント;そうしないと、有効な条件でも失敗する可能性があります。

    if (i % 2 == 0) {
       ...
    } else {
        assert i % 2 == 1 : i;
        ...
    }
    

    アサーションを使用しない場合

    1. public メソッドでの引数チェック

    パブリック メソッドの引数は、ユーザーが指定できます。

    したがって、アサーションを使用してこれらの引数をチェックすると、条件が失敗して AssertionError になる可能性があります。 .

    アサーションを使用する代わりに、適切な実行時例外を発生させ、これらの例外を処理します。


    2.プログラムの動作に影響を与える式を評価する

    アサーション条件で後でプログラム操作に影響を与える可能性のあるメソッドを呼び出したり、例外を評価したりしないでください。

    リスト weekdays の例を見てみましょう 1 週間のすべての曜日の名前が含まれています。

    
    ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
    
    ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
    
    assert weekdays.removeAll(weekends);
    

    ここでは、要素 Saturday を削除しようとしています と Sunday ArrayList 平日から .

    アサーションが有効になっている場合、プログラムは正常に動作します。ただし、アサーションが無効になっている場合、リストの要素は削除されません。これにより、プログラムが失敗する可能性があります。

    代わりに、結果を変数に代入し、その変数をアサーションに使用してください。

    ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
    
    ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
    
    boolean weekendsRemoved = weekdays.removeAll(weekends);
    assert weekendsRemoved;
    

    このようにして、すべての週末を確実にすることができます 平日から削除されます アサーションが有効か無効かに関係なく。その結果、今後のプログラムの動作には影響しません。


    Java

    1. Java オペレーター
    2. Java コメント
    3. Java if...else ステートメント
    4. Java for-each ループ
    5. Java break ステートメント
    6. Java 文字列
    7. Java インターフェイス
    8. Java匿名クラス
    9. Java try-with-resources
    10. Java アノテーション
    11. Java ベクトル