質問

Java例外処理と使用の違いは何ですか assert 条件?

Assert には 2 つのタイプがあることが知られています。しかし、いつ使用すればよいですか assert キーワード?

役に立ちましたか?

解決

あなたのコード内の内部ロジックチェックのアサーションを使用し、あなたの即時のコードのコントロール外のエラー条件のため、通常の例外を除いています。

あなたは、引数の検証のようなものを心配している場合、それは例外を使用して、明示的でなければなりません -

アサーションがオン・オフすることができることを忘れないでください。 (あなたが、しかし、その時点で違反が内部のバグではなく、外部のエラーが原因であることを理由に、アサーションを使用して、のプライベートのメソッドに引数の検証を実行することを選択することができる。)

また、それはすべてのために例外を使用して全体の合理的な(IMO)です。私は個人的に非常にまったくアサーションを使用していないが、それはある程度個人の好みの問題です。 (そこは確かのためのアサーションに対する客観引数であってもよいが、それは十分に完全に好みを除去するための明確ではありませんすることができます。)

他のヒント

Java アサーションは、Java 例外と例外処理に基づいて構築されます。実際、Java アサーションが失敗すると、結果は AssertionError 例外となり、他の Java 例外と同様にキャッチできます。例外とアサーションの主な違いは次のとおりです。

  • アサーションは 意図されました プログラミング エラー、別名バグを検出する手段としてのみ使用されます。対照的に、例外は他の種類のエラーまたは「例外的な」状態を示す場合があります。例えば無効なユーザー入力、欠落しているファイル、ヒープがいっぱいなど。
  • Java 言語は、次の形式でアサーションの構文サポートを提供します。 assert 声明。以下を比較してください。

    if (x != y) {
         throw new SomeException("x != y");
    }
    
    assert x != y;
    
  • 最も重要なことは、Java では、JVM の起動時にアサーション チェックをグローバルまたは個々のクラスで有効または無効にできることです。

注記:そうすべきだと言う人もいます いつも アサーション チェックをオフにして運用コードを実行します。私はこれを包括的な意見として反対する傾向があります。運用コードが安定していることがわかっていて、そのコードからパフォーマンスの最後の部分を絞り出す必要がある場合は、アサーションをオフにするのが適切です。しかし、(たとえば) 10% のパフォーマンス ヒットが実際の問題ではない場合、代替手段が継続してデータベースを破損する場合は、アサーション エラーでアプリケーションを終了させることを希望します。

@Mario Ortegón は次のようにコメントしました。

「オフにする」のは、アサーションを使用して、最適化されたアルゴリズムの実装をよく知られているが遅いアルゴリズムと比較することによって、そのアルゴリズムの結果を検証できるためです。したがって、開発ではそれを呼び出しても問題ありません O(N^3) と主張するメソッド O(log N) アルゴリズムは意図したとおりに機能します。しかし、これは運用環境では望ましくないことです。

そう思うかどうかは別として いい練習 運用環境でアサーションをオフにするには、間違いなく 悪い習慣 有効にすると、パフォーマンスに重大な影響を与えるアサーションを作成できます。なぜ?これは、運用環境 (問題を追跡するため) またはストレス/キャパシティ テストでアサーションを有効にするオプションがなくなったことを意味するためです。私の意見では、もしそうする必要があるなら、 O(N^3) 事前/事後条件テストは、単体テストで実行する必要があります。

例外実装は、任意の予想又は予期しないエラーなしで実行されているかどうかを確認する機構です。だから、私たちは、例外は基本的に例外をより良い方法で、アプリケーションの実行中にも、予期せぬ状況を扱うので、使用のために使用されていることがわかり効果的に堅牢なアプリケーションになります。

アサーションは、アプリケーションの一部の機能の実装の一部であってはなりません。彼らは唯一の仮定を確認するために使用されなければならない - 。ただ、我々は解決策をdesingingするだけでなく実用的で、実際に有効である一方、仮定どんなことを確認するために、

参照:ます。http://geekexplains.blogspot。 COM / 2008/06 / asserionsインのjava-アサーション-vs.htmlする

アサーションは、実際にはちょうど彼らが旗問題を意志の例外のように、例外と非常に似ていますが、例外とは違って - 彼らは、任意の代替実行パスを示唆していますが、単純に失敗します。 なぜ例外を除いてより多くのあなたが同じことを行うことができれば、アサーションを使用し、プラス?

最初の場所で発生しません、実際の問題が修正されるべきでないときにそれらを使用し、。これは、最初は奇妙に聞こえる:我々は、すべての潜在的な問題から私たちのコードを保護するためにしたくないですか?通常、はい。しかし、私たちがいない場合があります。この場合は、呼び出された:「契約による設計」

あなたは、銀行のためのアプリケーションを書いているとしましょう。開発者として、あなたはおそらく、すべての可能な財務状況をサポートすることはできません。だから、コードを開始する前に、あなたはあなたに、このアプリケーションがサポートする必要がある有効範囲を与え、銀行からの仕様を取得します。だからあなたのアプリケーションは、(銀行からのスペックによる)契約によって設計されています。この契約は、常にあなたのアプリケーションが動作するために真であるべき基本原則を定義します。 (彼らは変更できないため)これらの基本的な原則は「不変式」と呼ばれています。契約による設計は、開発者としてのあなたの人生を簡素化する - あなたは契約で定義された作業の範囲をサポートするためにのみ責任がある
。 その重要なのは、あなたのコードでこれらの不変量の値を確認していますが、彼らは例外があるかのようにそれらをチェックし、それらを回避しようとするべきではありません。彼らは間違っている場合は - 。入力はその契約上の義務を履行していないので、あなたが失敗しなければなりません。

興味深いのは、次のとおりです。あなたは、重要な場所にアサーションを入れていないと不変条件が無効になっている場合 - あなたのコードは、とにかく失敗します。あなただけの理由を知ることができません。だから、要約する - アサーションは、不変条件を検証するために使用されています。彼らは、「設計契約により、」原則と手に手を行きます。彼らは生産にオフになっている理由thatsの、問題をデバッグするためにそれらを使用します。

別のユースケース:あなたは完全に信頼していない外部ライブラリに依存している場合 - あなたはそれを呼び出すときにアサートステートメントを使用することもできます。

いくつかはまた、(やってそのように簡単以来)例外のために迅速かつ汚い代用品としてアサーションを使用しますが、概念的にそれを行うために適切なものではありません。

のAssertの良い使用例:

assert flibbles.count() < 1000000; // too many flibbles indicate something is awry
log.warning("flibble count reached " + flibbles.count()); // log in production as early warning

私は個人的にあなたが何かは、の望ましいの範囲外ですが、あなたはそれが継続して合理的に安全です確認することができます知っているときアサートがのみを使用する必要があることだと思います。他のすべての状況(私は考えていない状況を自由点を感じる)で、ハードと高速失敗する例外を使用します。

私のための重要なトレードオフは、あなたが破損を避けるために、例外でライブ/生産システムをダウンさせると簡単にトラブルシューティングを行いたいかどうか、またはあなたは、テスト/デバッグで見過ごされ続けることを許可すべきではない状況に遭遇したかどうかバージョンはなく、(当然の警告をログ)の生産に継続させることができます。

CF。 http://c2.com/cgi/wiki?FailFast にも、この私のC#のコピーを参照してください答え: Debug.Assertの対特定の例外がスローされた

アサートのみ目的をデバッグするためであり、そのトリガ条件が発生してはならない(などがあってはならないヌルポインタを、。)

例外が常に発生する可能性があり、特別なシステムイベントのためにある:。などにFileNotFound、ConnectionToServerLostを、

アサーションと例外処理の両方のプログラムの正しさを保証し、論理エラーを回避することができ、

が、アサーションを有効にして、プログラマの願いとして無効にすることができ、

コンパイラであなたは "javaのJavaFileName -ea" または "javaの-enableasserations JavaFileName" を使用している場合 あなたが主張してコンパイルすることができます。

プログラマは、 "Javaの-da JavaFileName" または "javaの-disableasserations JavaFileName" それを必要としない場合、彼らはアサーションを無効にすることができます。

例外処理では、この施設ではない。

アサーションは、唯一の例外は終了からプログラムを防止するために、プログラムの実行中にチェックされるべき特定の条件をチェックすることであるがアサート機能を有効にすることによって実行時にチェックする必要が仮定のデバッグのために使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top