137

何をし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);
}
4

8 に答える 8

236

-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ステートメントアサーションはブール式を含むステートメントです。アサーションは有効または無効のいずれかです。アサーションが有効になっている場合、アサーションを実行するとブール式が評価され、式がに評価されるとエラーが報告されます。アサーションが無効になっている場合、アサーションの実行は何の効果もありません。
assertfalse

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


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

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

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

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


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

于 2010-06-10T21:40:22.790 に答える
12

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

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

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

于 2010-06-10T21:36:29.893 に答える
5

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

于 2010-06-10T21:33:51.107 に答える
5

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

理解を非常に簡単にします。

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

    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を配置すると、次のようになります。

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

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

于 2014-06-13T06:16:06.600 に答える
1

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

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

JavaDoc

于 2010-06-10T21:34:52.337 に答える
1

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

あなたの場合、それは入ってくるパラメータのデータ検証を行いますが、クライアントが将来関数を誤用するのを防ぐことはできません。特に含まれていない場合(および含まれてはならない)、リリースビルドに含まれます。

于 2010-06-10T21:46:24.387 に答える
0

これにより、式がtrueを返すことが保証されます。それ以外の場合は、をスローしjava.lang.AssertionErrorます。

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

于 2010-06-10T21:33:40.413 に答える
0

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

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

これを次のように実行する場合:java -ea -jar peiska.jar

java.lang.AssertionErrorをスローします

于 2010-06-10T21:37:00.313 に答える