ホームページ  >  記事  >  Java  >  Javaトラップのassertキーワードの詳細な説明

Javaトラップのassertキーワードの詳細な説明

高洛峰
高洛峰オリジナル
2017-01-16 16:04:111859ブラウズ

1. 概要

C言語やC++言語にはアサーションを意味するassertキーがあります。
Java にも、アサーションを意味するassert キーワードがあります。使い方と意味は似ています。

2. 構文
Java では、古いバージョンの Java コードでのassert キーワードの使用によって引き起こされるエラーを回避するために、Java では実行時にアサーション チェックが有効になりません。現時点では、すべてのアサーション ステートメントは無視されます。)、アサーション チェックを有効にしたい場合は、スイッチ -enableassertions または -ea を使用して有効にする必要があります。

assert キーワードの構文は非常に単純で、次の 2 つの用途があります:

1. アサート 9cc8d4754b7ff9832d51db33f55f77ca
9cc8d4754b7ff9832d51db33f55f77ca が true の場合、プログラムは実行を続けます。
false の場合、プログラムは AssertionError をスローして実行を終了します。

2. アサート :
が true の場合、プログラムは実行を続行します。
false の場合、プログラムは java.lang.AssertionError をスローし、185f7d05e1a42eec2c84f8a0e49e4024 を入力します。

3. アプリケーション例

その使用法を説明するための例を以下に示します。

public class AssertFoo {
    public static void main(String args[]) {
        //断言1结果为true,则继续往下执行
        assert 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
Assert 1 問題ありません、行きましょう!

-----------------

アサーション 2 は問題ありません。Go!

3. -ea スイッチをオンにしてプログラムを実行します:
C:>java -ea AssertFoo
アサーション 1 には問題ありません。Go!

-----------------

スレッド "main" java.lang.AssertionError: アサーションが失敗しました。例外がスローされると、この式の情報がスローされます
出力! T atassertfoo.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 についての考え

assert はテストプログラムのデバッグ用であり、正式な運用環境では使用されないため、JUint の役割を置き換えるために、JUint のテストを検討する必要があります。これは他の何よりも悪い機能です。 。もちろん、IDE デバッグを通じてデバッグとテストを実行できます。この観点からすると、assert の将来は暗いです。

したがって、いつか Java が -ea スイッチをデフォルトでサポートする日が来るまでは、Java でのassert キーワードの使用は避けるべきであり、そのときはそれを検討してもよいでしょう。 Assert がどれだけのメリットとどれだけのトラブルをもたらすかを比較して、これを使用するかどうかを選択するのが原則です。

=============================================== == ============
コメント:
一方、validator や junit などの一部のオープンソース コンポーネントでは、判定プロセスにアサーション スタイルが使用されているようで、多数のアサーションが使用されていますが、ソース コードを見るまではわかりません。
開発段階での簡単なテストであれば、junit は便利で強力なツールです。アサーションを自分で作成して使用しない理由はありません。

=============================================== == ============
コメント:
まず、単体テストコードで使用できます。 Junit は非常に煩わしいものであり、プロジェクト全体の大量のコードで Junit が使用されている場合、それを削除したり、別のフレームワークを選択したりすることが困難になります。単体テスト コードが多数あり、これらの単体テスト ケースを再利用したい場合は、TestNG などの他の単体テスト フレームワークの使用を容易にするために、junit ではなく Assert を選択する必要があります。同じ理由で、Junit は正式な関数コードにはまったく使用すべきではなく、assert は主に基本クラス、フレームワーク クラス、インターフェイス クラス、コア コード クラス、およびツール クラスに使用する必要があります。つまり、コードの呼び出し元が別のプログラマまたは別のサブシステムによって作成されたビジネス コードである場合に、これを使用する必要があります。たとえば、クイックソートアルゴリズムを作成した場合

public static List<int> quickSort(List<int> list){
  assert list != null;
  // 申请临时空间
  //开始排序
  for(int i : list){
      //
  }
}

この場合、渡されたパラメータの正確性をチェックしないと、不可解なヌルポインタエラーがスローされます。呼び出し元はコードの詳細を知らない可能性があり、システムの奥深くで null ポインター エラーをデバッグするのは時間の無駄です。渡されたパラメータに問題があることを呼び出し元に直接かつ明確に伝える必要があります。そうしないと、コードにバグがあるのではないかと疑われるでしょう。 Assert を使用すると、2 人のプログラマが自分が書いたコードの問題についてお互いを責めることを防ぐことができます。

assert は、特定のエラーが何であるかを知っており、呼び出し元がエラーを削除または確認する必要があることにあなたと呼び出し元が同意しているエラーに適用されます。アサーションを介して発信者に通知します。 assert は、ユーザー入力データのエラーや外部ファイルのフォーマット エラーなど、外部システムによって引き起こされるエラーには適用されません。これらのエラーは呼び出し元ではなくユーザーによって引き起こされ、入力エラーやファイル形式エラーは一般的であり、これらのエラーはビジネス コードによってチェックされる必要があるため、例外でもありません。

assert は、頻繁に呼び出される基本クラス、フレームワーク コード、ツール クラス、コア コード、インターフェイス コードに適しているため、実行時に削除されます。システムの奥深くにあるコア コードの慎重なテストを容易にするために、テスト コードではテスト フェーズ中に -ea パラメーターを有効にする必要があります。

Java が Assert をあまり頻繁に使用しない理由は、Java には非常に完全な OO システムがあり、強制的な型変換が発生する頻度が低いため、ポインタの型が正しいかどうか、ポインタが空かどうかを頻繁にチェックする必要がないためです。 C.同時に、Java がメモリやバッファを直接管理することはほとんどないため、受信バッファが空かどうか、または境界を越えているかどうかを頻繁にチェックする必要はありません。

しかし、assert をうまく使用すると、フレームワーク コードの正確性が向上し、フレームワーク コードのユーザーのデバッグ時間を短縮できます。

=============================================== == ===============
コメント:
assert の目的は、プログラマーがプログラムの効率に影響を与えることなく、独自の論理エラーを簡単に発見できるようにすることです。 Assert によって検出されたエラーはまったく発生してはならず、例外によって置き換えることもできません。例外はシステムによって許可されている、またはシステムによって制御できない「エラー」であり、プログラマの論理的な問題ではありません。

assert は開発中にオンにし、リリース後にオフにする必要があります。

Java トラップの Assert キーワードの詳細な説明と関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。