1. 概要
C および C++ 言語にはアサート キーがあり、これはアサーションを意味します。
Java にもアサーションを意味するassert キーワードがありますが、使い方と意味は似ています。
2. 文法
Java では、assert キーワードが JAVA SE 1.4 から導入されました。古いバージョンの Java コードでのassert キーワードの使用によって引き起こされるエラーを回避するために、Java は実行時にデフォルトでアサーション チェックを有効にしません (現時点では、すべての Assertion ステートメントは有効になります)。無視されます!)、アサーション チェックを有効にしたい場合は、スイッチ -enableassertions または -ea を使用してオンにする必要があります。
Assert キーワードの構文は非常に単純で、次の 2 つの用途があります。
1.アサート<ブール式>
<ブール式> が true の場合、プログラムの実行は続行されます。
false の場合、プログラムは AssertionError をスローし、実行を終了します。
2.assert <ブール式>: <エラーメッセージ式>
<ブール式> が true の場合、プログラムの実行は続行されます。
false の場合、プログラムは java.lang.AssertionError をスローし、<エラー メッセージ式> を入力します。
3. 応用例
その使用法を示す例を以下に示します。
次のようにコードをコピーします。
パブリック クラス AssertFoo {
public static void main(String args[]) {
//アサーション 1 の結果が true の場合、実行を続行します。
true をアサートします。
System.out.println("アサーション 1 には問題ありません。Go!");
System.out.println("/n-----------------/n");
//アサーション 2 の結果は false となり、プログラムは終了します
assert false : "アサーションが失敗しました。例外がスローされたときにこの式の情報が出力されます!";
System.out.println("アサーション 2 には問題ありません。Go!");
}
}
コードを C:/AssertFoo.java に保存し、次のように実行してコンソール出力を表示します。
1. プログラムをコンパイルします。
C:/>javac AssertFoo.java
2. プログラムは、-ea スイッチをオンにせずにデフォルトで実行されます。
C:/>java AssertFoo
アサーション 1 は問題ありません。Go!
------------------
アサーション 2 は問題ありません。Go!
3. -ea スイッチをオンにして、プログラムを実行します。
C:/>java -ea AssertFoo
アサーション 1 は問題ありません。Go!
------------------
スレッド "main" java.lang.AssertionError での例外: アサーションが失敗しました。この式の情報は
例外がスローされたときに出力されます。
AssertFoo.main(AssertFoo.java:10) で
4. トラップ
assert キーワードは使い方が簡単ですが、assert を使用すると、より深い罠にはまってしまうことがよくあります。避けるべきです。研究の結果、著者は次の理由を要約しました。
1. 有効にするには、assert キーワードを実行時に明示的に有効にする必要があります。そうしないと、アサーションが無意味になってしまいます。現在、主流の Java IDE ツールでは、デフォルトでは -ea アサーション チェック機能が有効になっていません。これは、IDE ツールを使用してコーディングすると、デバッグ時や実行時に問題が発生することを意味します。さらに、Java Web アプリケーションの場合、プログラム コードはコンテナーにデプロイされるため、プログラムの実行を直接制御することはできません。-ea スイッチをオンにする必要がある場合は、Web コンテナーの実行構成パラメーターを変更する必要があります。これは、プログラムの移植と展開に大きな不便をもたらします。
2. if の代わりにassert を使用するのが 2 番目のトラップです。 Assert の判断は if ステートメントの判断に似ていますが、この 2 つの機能は本質的に異なります。assert キーワードはプログラムのテストとデバッグ時に使用することを目的としていますが、誤って Assert を使用してプログラムのビジネス プロセスを制御すると、プログラムの完了後にassert キーワードを削除することは、プログラムの通常のロジックを変更することを意味します。
3. アサート アサーションが失敗した場合、プログラムは終了します。これは実稼働環境では決して許容されません。プログラム内の潜在的なエラーは、通常、例外処理によって解決されます。ただし、アサーションの使用は非常に危険で、一度失敗するとシステムがハングします。
5. アサートについての考え方
Assert はテスト プログラムをデバッグするためのものであり、正式な運用環境で使用するためのものではないため、JUint がその機能を置き換えるために、Assert よりも多くの重要な機能を備えた JUint をテストすることを検討する必要があります。もちろん、IDE デバッグを通じてデバッグとテストを実行できます。この観点からすると、assert の将来は暗いです。
したがって、いつか Java が -ea スイッチをデフォルトでサポートする日が来るまでは、Java でのassert キーワードの使用は避けてください。そのときは、それを検討してもよいでしょう。 Assert がどれだけのメリットとどれだけのトラブルをもたらすかを比較して、これを使用するかどうかを選択するのが原則です。
================================================= ==========
コメント:
一方、validator や junit などの一部のオープン ソース コンポーネントでは、判定プロセスにアサーション スタイルが使用されているようです。多数のアサーションが使用されている可能性が非常に高いですが、作成者はアサーションを確認する前には確認できません。ソースコード。
開発段階での簡単なテストであれば、junit は便利で強力なツールです。独自のアサーションを作成するときにこれを使用しない理由はありません。
================================================= ==========
コメント:
まず、単体テスト コードで使用できます。 Junit は非常に煩わしいものであり、プロジェクト全体の大量のコードで Junit が使用されている場合、それを削除したり、別のフレームワークを選択したりすることが困難になります。単体テスト コードが多数あり、これらの単体テスト ケースを再利用したい場合は、TestNG などの他の単体テスト フレームワークの使用を容易にするために、junit ではなく Assert を選択する必要があります。同じ理由で、Junit は正式な関数コードにはまったく登場すべきではなく、assert を使用する必要があります。
assert は主に、基本クラス、フレームワーク クラス、インターフェイス クラス、コア コード クラス、およびツール クラスに適しています。つまり、コードの呼び出し元が別のプログラマまたは別のサブシステムによって作成されたビジネス コードである場合に、これを使用する必要があります。たとえば、クイックソートアルゴリズムを作成すると、
次のようにコードをコピーします。
public static List<int> QuickSort(List<int> list){
アサートリスト != null;
//一時スペースを申請する
//ソート開始
for(int i : リスト){
//
}
}
この場合、受信パラメータの正確性がチェックされないと、不可解な null ポインタ エラーがスローされます。呼び出し元はコードの詳細を知らない可能性があり、システムの奥深くで null ポインター エラーをデバッグするのは時間の無駄です。渡されたパラメータに問題があることを呼び出し元に直接かつ明確に伝える必要があります。そうしないと、コードにバグがあるのではないかと疑われるでしょう。 Assert を使用すると、2 人のプログラマが自分が書いたコードの問題についてお互いを責めることを防ぐことができます。
Assert は、エラーの内容が正確にわかっており、呼び出し元がエラーを削除またはチェックする必要があることに同意したエラーに適用されます。アサーションを介して発信者に通知します。 assert は、ユーザー入力データのエラーや外部ファイルのフォーマット エラーなど、外部システムによって引き起こされるエラーには適用されません。これらのエラーは呼び出し元ではなくユーザーによって引き起こされ、入力エラーやファイル形式エラーは一般的であり、これらのエラーはビジネス コードによってチェックされる必要があるため、例外でもありません。
Assert は、頻繁に呼び出される基本クラス、フレームワーク コード、ツール クラス、コア コード、およびインターフェイス コードに適しているため、実行時に削除されます。システムの奥深くにあるコア コードの慎重なテストを容易にするために、テスト コードではテスト フェーズ中に -ea パラメーターを有効にする必要があります。
Java で Assert の使用頻度が低い理由は、Java の OO システムが非常に完成しており、強制的な型変換が発生する頻度が低いため、C のようにポインタの型が正しいかどうか、ポインタが空かどうかを頻繁に確認する必要がないためです。同時に、Java がメモリやバッファを直接管理することはほとんどないため、受信バッファが空かどうか、または境界を越えているかどうかを頻繁にチェックする必要はありません。
ただし、assert をうまく使用すると、フレームワーク コードの正確性が向上し、フレームワーク コードのユーザーのデバッグ時間を短縮できます。
================================================= =============
コメント:
Assert の目的は、プログラマがプログラムの効率に影響を与えることなく、自分自身の論理エラーを簡単に発見できるようにすることです。 Assert によって検出されたエラーはまったく発生してはならず、例外によって置き換えることもできません。例外はシステムによって許可されている、またはシステムによって制御できない「エラー」であり、プログラマの論理的な問題ではありません。
assert は開発中にオンにし、リリース後にオフにする必要があります。