web-dev-qa-db-ja.com

「assert」キーワードは何をしますか?

assertは何をしますか?関数の例:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
134
Peiska

-enableassertions(または略して-ea)を使用してプログラムを起動すると、このステートメント

assert cond;

と同等です

if (!cond)
    throw new AssertionError();

このオプションなしでプログラムを起動した場合、assertステートメントは効果がありません。

たとえば、質問に投稿されたassert d >= 0 && d <= s.length();は次と同等です

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

-enableassertionsで起動した場合、つまり。)


正式には、 Java言語仕様:14.10。assertステートメント は次のことを言っています。

14.10。 assertステートメント
アサーションは、ブール式を含むassertステートメントです。アサーションは有効または無効です。アサーションが有効になっている場合、アサーションの実行によりブール式が評価され、式がfalseと評価されると、エラーが報告されます。アサーションが無効になっている場合、アサーションの実行はまったく効果がありません。

「有効または無効」-eaスイッチで制御され、「エラーが報告されました」AssertionErrorがスローされます。


そして最後に、assertのあまり知られていない機能:

次のように: "Error message"を追加できます。

assert d != null : "d is null";

スローされたAssertionErrorのエラーメッセージを指定します。


この投稿は記事として書き直されました here

227
aioobe

条件が満たされない場合、AssertionErrorがスローされます。

ただし、アサーションを有効にする必要があります。それ以外の場合、assert式は何もしません。見る:

http://Java.Sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

12
Richard Fearn

私はこれについて多くのドキュメントを読みましたが、それをどのように、いつ、どこで使用するかについて、まだ混乱しています。

わかりやすくする:

このような同様の状況がある場合:

    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 

StrAがstrBに対してNULL値を生成する可能性があるという警告(strB = strA.toLowerCase();に黄色の線を表示)を受け取る場合があります。 strBが最終的には絶対にnullにならないことはわかっていますが、念のためにassertを使用して

1。警告を無効にします。

2。最悪の事態が発生した場合(アプリケーションの実行時)例外エラーをスローします。

いつか、コードをコンパイルしても結果が得られず、バグになります。しかし、アプリケーションはクラッシュせず、このバグの原因を見つけるのに非常に苦労します。

したがって、次のようにアサートを配置すると:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();

strAは絶対にnull値ではないことをコンパイラに伝えると、警告を「平和的に」オフにすることができます。 NULL(最悪の場合)の場合、アプリケーションを停止し、バグを検出して見つけます。

5
felixwcf

assertは、条件が真でない場合にプログラムがAssertionFailed例外をスローするデバッグツールです。この場合、それに続く2つの条件のいずれかがfalseと評価されると、プログラムは例外をスローします。 一般的に、assertは製品コードでは使用しないでください

5
Chris Thompson

アサーションは通常、主にプログラムの予想される動作を確認する手段として使用されます。ほとんどの場合、プログラムの状態に関するプログラマーの仮定は誤りであるため、クラッシュにつながるはずです。これが、アサーションのデバッグの側面の出番です。アサーションは、正しい動作を行いたい場合に無視できないチェックポイントを作成します。

あなたの場合、それはクライアントが将来関数を誤用することを防ぐものではありませんが、着信パラメータのデータ検証を行います。特にそうでない場合は、リリースビルドに含めてください(そうすべきではありません)。

1
Zoli

このバージョンのassertステートメントを使用して、AssertionErrorの詳細メッセージを提供します。システムは、Expression2の値を適切なAssertionErrorコンストラクターに渡します。このコンストラクターは、値の文字列表現をエラーの詳細メッセージとして使用します。

詳細メッセージの目的は、アサーション障害の詳細をキャプチャして伝達することです。このメッセージにより、アサーションが失敗する原因となったエラーを診断し、最終的に修正できます。詳細メッセージはユーザーレベルのエラーメッセージではないため、通常、これらのメッセージを単独で理解可能にしたり、国際化する必要はありません。詳細メッセージは、失敗したアサーションを含むソースコードとともに、完全なスタックトレースのコンテキストで解釈されることを意図しています。

JavaDoc

1
Jan Kuboschek

式がtrueを返すようにします。それ以外の場合は、Java.lang.AssertionErrorをスローします。

http://Java.Sun.com/docs/books/jls/third_edition/html/statements.html#14.1

0
Brett Kail

アサーションをオンにしてアプリを実行すると、AssertはAssertionErrorをスローします。

int a = 42;
assert a >= 0 && d <= 10;

これを実行する場合、次のように言います:Java -ea -jar peiska.jar

Java.lang.AssertionErrorをスローします。

0
NoozNooz42