アサーションを使用する
assert( Assertion
) はプログラムをデバッグする方法の 1 つです。ではJava
、assert
キーワードを使用してアサーションを実装します。
まず例を見てみましょう。
public static void main(String[] args) {
double x = Math.abs(-123.45);
assert x >= 0;
System.out.println(x);
}
ステートメントはassert x >= 0;
アサーションであり、アサーション条件 x >= 0 が true であることが期待されます。false と評価された場合、アサーションは失敗し、スローされますAssertionError
。
Assert ステートメントを使用する場合、オプションのアサーション メッセージを追加することもできます。
assert x >= 0 : "x must >= 0";
このようにして、アサーションが失敗すると、 ``AssertionError`` はメッセージ x が 0 >= 0 でなければならないというメッセージを表示します。これはデバッグに便利です。
Java アサーションの特徴は、アサーションが失敗するとスローされAssertionError
、プログラムが終了して終了することです。したがって、アサーションは回復可能なプログラミング エラーには使用できず、開発およびテスト中にのみ使用する必要があります。
アサーションは、回復可能なプログラミング エラーには使用しないでください。例えば:
void sort(int[] arr) {
assert arr != null;
}
例外は上位層でスローおよびキャッチされる必要があります。
void sort(int[] arr) {
if (arr == null) {
throw new IllegalArgumentException("array cannot be null");
}
}
たとえば、プログラムでassertを使用する場合、単純なアサーションは次のようになります。
// assert
public class Main {
public static void main(String[] args) {
int x = -1;
assert x > 0;
System.out.println(x);
}
}
x は 0 より大きくなければならない、実際には x は -1 であることをアサートすると、アサーションは確実に失敗します。上記のコードを実行すると、プログラムは をスローせずAssertionError
、通常どおり x の値を出力したことがわかりました。
このファットフォーはどうですか?Assert ステートメントが機能しないのはなぜですか?
これは、JVM
アサーション命令がデフォルトでオフになっているためです。つまり、assert ステートメントは自動的に無視され、実行されません。
Assert ステートメントを実行するには、-enableassertions` (-ea と省略) パラメータを Java 仮想マシンに渡してアサーションを有効にする必要があります。したがって、上記のプログラムを有効にするには、コマンド ラインで実行する必要があります。
$ java -ea Main.java
Exception in thread "main" java.lang.AssertionError
at Main.main(Main.java:5)
特定のクラスのアサーションを選択的に有効にすることもできます。コマンド ライン パラメーターは次のとおりです。これは、このクラス-ea:com.itranswarp.sample.Main
のcom.itranswarp.sample.Main
アサーションのみを有効にすることを意味します。
または、特定のパッケージのアサーションを有効にします。コマンド ライン パラメーターは次のとおりです-ea:com.itranswarp.sample...
(最後に 3 . があることに注意してください)。これは、com.itranswarp.sample
このパッケージのアサーションを有効にすることを意味します。
実際の開発では、アサーションが使用されることはほとんどありません。より良い方法は単体テストを作成することです。JUnit の使用法については後ほど説明します。
まとめ
アサーションはデバッグの方法であり、アサーションの失敗はスローされAssertionError
、アサーションは開発およびテスト段階でのみ有効にできます。
回復可能なエラーはアサートできませんが、例外をスローする必要があります。
アサーションが使用されることはほとんどありません。より良いアプローチは単体テストを作成することです。
読んだ後に何かを得た場合は、Knowledge Planet コミュニティのディスカッションに参加することもできます。