何をし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);
}
-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のエラーメッセージを指定します。
この投稿はここの記事として書き直されました。
条件が満たされない場合は、AssertionError
がスローされます。
ただし、アサーションを有効にする必要があります。それ以外の場合、assert
式は何もしません。見る:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
AssertionFailed
は、条件が真でない場合にプログラムが例外をスローするようにするデバッグツールです。この場合、プログラムは、それに続く2つの条件のいずれかがfalseと評価された場合に、例外をスローします。 一般的に言えば、assert
本番コードでは使用しないでください
私はこれについて多くのドキュメントを読みましたが、それをどのように、いつ、どこで使用するかについてはまだ混乱しています。
理解を非常に簡単にします。
このような同様の状況がある場合:
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の場合(最悪の場合)、アプリケーションを停止し、バグをスローして見つけます。
このバージョンのassertステートメントを使用して、AssertionErrorの詳細メッセージを提供します。システムは、Expression2の値を適切なAssertionErrorコンストラクターに渡します。このコンストラクターは、値の文字列表現をエラーの詳細メッセージとして使用します。
詳細メッセージの目的は、アサーションの失敗の詳細をキャプチャして伝達することです。このメッセージにより、アサーションが失敗する原因となったエラーを診断し、最終的に修正できるようになります。詳細メッセージはユーザーレベルのエラーメッセージではないため、通常、これらのメッセージを個別に理解できるようにしたり、国際化したりする必要はありません。詳細メッセージは、失敗したアサーションを含むソースコードと併せて、フルスタックトレースのコンテキストで解釈されることを目的としています。
アサーションは通常、主にプログラムの予想される動作をチェックする手段として使用されます。プログラムの状態に関するプログラマーの仮定は誤りであるため、ほとんどの場合、クラッシュにつながるはずです。ここで、アサーションのデバッグの側面が役立ちます。アサーションは、正しい動作が必要な場合に無視できないチェックポイントを作成します。
あなたの場合、それは入ってくるパラメータのデータ検証を行いますが、クライアントが将来関数を誤用するのを防ぐことはできません。特に含まれていない場合(および含まれてはならない)、リリースビルドに含まれます。
これにより、式がtrueを返すことが保証されます。それ以外の場合は、をスローしjava.lang.AssertionError
ます。
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10
アサーションをオンにしてアプリを実行すると、AssertはAssertionErrorをスローします。
int a = 42;
assert a >= 0 && d <= 10;
これを次のように実行する場合:java -ea -jar peiska.jar
java.lang.AssertionErrorをスローします