1. 序章

Java assert キーワードを使用すると、開発者はプログラムの特定の仮定または状態をすばやく確認できます。

この記事では、Javaassertキーワードの使用方法を見ていきます。

2. Javaアサーションの歴史

Java assertキーワードはJava1.4で導入されたため、かなり前から存在しています。 ただし、ボイラープレートを大幅に削減し、コードを読みやすくすることができる、あまり知られていないキーワードのままです。

たとえば、コードでは、アプリケーションが正しく機能しない可能性のある特定の条件を確認する必要があることがよくあります。 通常、次のように記述します。

Connection conn = getConnection();
if(conn == null) {
    throw new RuntimeException("Connection is null");
}

アサーションを使用すると、ifおよびthrowステートメントを単一のassertステートメントで削除できます。

3. Javaアサーションの有効化

Javaアサーションはassertキーワードを使用するため、インポートする必要のあるライブラリやパッケージはありません。

Java 1.4より前では、変数やメソッドなどの命名に「アサート」という単語を使用することは完全に合法であったことに注意してください。 これにより、新しいバージョンのJVMで古いコードを使用すると、名前の衝突が発生する可能性があります。

したがって、下位互換性のために、JVMはデフォルトでアサーション検証を無効にします。 これらは、 -enableassertions コマンドライン引数、またはその省略形 -ea:のいずれかを使用して明示的に有効にする必要があります。

java -ea com.baeldung.assertion.Assertion

この例では、すべてのクラスに対してアサーションを有効にしました。

特定のパッケージおよびクラスのアサーションを有効にすることもできます。

java -ea:com.baeldung.assertion... com.baeldung.assertion.Assertion

ここでは、com.baeldung.assertionパッケージのすべてのクラスに対してアサーションを有効にしました。

同様に、 -disableassertions コマンドライン引数、またはその省略形 -da を使用して、特定のパッケージおよびクラスに対して無効にすることができます。 これらの4つの引数すべてを一緒に使用することもできます。

4. Javaアサーションの使用

アサーションを追加するには、単にassertキーワードを使用して、ブール条件を指定します

public void setup() {
    Connection conn = getConnection();
    assert conn != null;
}

Javaは、文字列を受け取るアサーションの2番目の構文も提供します。これは、AssertionErrorがスローされた場合に作成するために使用されます。

public void setup() {
    Connection conn = getConnection();
    assert conn != null : "Connection is null";
}

どちらの場合も、コードは外部リソースへの接続がnull以外の値を返すことを確認しています。 その値がnullの場合、JVMは自動的にAssertionErrorをスローします。

2番目のケースでは、例外にはスタックトレースに表示され、問題のデバッグに役立つ追加の詳細が含まれます。

アサーションを有効にしてクラスを実行した結果を見てみましょう。

Exception in thread "main" java.lang.AssertionError: Connection is null
        at com.baeldung.assertion.Assertion.setup(Assertion.java:15)
        at com.baeldung.assertion.Assertion.main(Assertion.java:10)

5. AssertionErrorの処理

クラスAssertionErrorErrorを拡張し、それ自体がThrowableを拡張します。 これは、AssertionErrorがチェックされていない例外であることを意味します。

したがって、アサーションを使用するメソッドはそれらを宣言する必要はなく、それ以上の呼び出しコードはそれらをキャッチしようとしないでください。

AssertionErrorsは、アプリケーションの回復不能な状態を示すことを目的としているため、それらを処理したり、回復を試みたりしないでください。

6. ベストプラクティス

アサーションについて覚えておくべき最も重要なことは、アサーションを無効にできることです。そのため、はアサーションが実行されるとは決して想定していません

したがって、アサーションを使用するときは、次の点に注意してください。

  • 常にnull値をチェックし、必要に応じてオプションを空にします
  • アサーションを使用してパブリックメソッドへの入力をチェックすることは避け、代わりにIllegalArgumentExceptionNullPointerExceptionなどのチェックされていない例外を使用してください。
  • アサーション条件でメソッドを呼び出さず、代わりにメソッドの結果をローカル変数に割り当て、その変数をassertで使用します
  • アサーションは、switchステートメントのdefaultの場合や、終了しないループの後など、コード内の決して実行されない場所に最適です。

7. 結論

Java assert キーワードは長年使用可能ですが、この言語のあまり知られていない機能のままです。 これは、多くの定型コードを削除し、コードを読みやすくし、プログラム開発の早い段階でバグを特定するのに役立ちます。

アサーションはデフォルトでは有効になっていないため、コードで使用されたときに実行されるとは決して想定しないでください。

いつものように、完全なソースコードはGitHubから入手できます。