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