2

重複の可能性:
assert は何をしますか?

assert は、例外の例外ハンドラーを記述することなく、開発中にプログラマーの仮定をテストします。これは、 assertについて検索したときに得たものです。

これとは別に、人々はそれが例外処理の代替であるとも言いました。例外処理コードを書くのに時間をかけたくない場合は、アサーションが重要になります。しかし、私はその働きと用途を理解していませんでした。誰でもこの例を説明してください。

class AssertExample {

    public static void main(String[] args) {
        int x = 0;
        assert (x > 0) ? "assertion failed" : "assertion passed";
        System.out.println("finished");
    } }
4

3 に答える 3

3

ウィキペディア:

コンピューター プログラミングでは、アサーションはプログラム内に配置される述語 (true-false ステートメント) であり、その場所で述語が常に真であると開発者が考えていることを示します。アサーションの使用は、プログラマーがプログラムを設計、開発、および推論するのに役立ちます。

-easwitchを使用して実行時にアサーションを有効にできます。アサーションは選択的に有効にすることもできます

java -ea:pl.maciejziarko.service.UserService

アサーションに関するいくつかの規則 (SCJP Sun Certified Programmer for Java 6 Study Guide から):

  • public メソッドの引数を検証するためにアサーションを使用しないでください
  • プライベート メソッドへの引数を検証するためにアサーションを使用する
  • コマンドライン引数の検証にアサーションを使用しない
  • アサーションを使用して、決して起こらないことがわかっているケースをチェックしてください
  • 副作用を引き起こす可能性のあるアサート式を使用しない
于 2012-11-04T12:39:20.930 に答える
3

assert例外を処理する方法ではなく、例外を検出する方法です。(したがって、あなたが見つけた説明は、私には少し的外れに思えます。)それは基本的に次のように言う方法です:

これは真実であるべきです。そうでない場合は、エラーをスローします。

そのエラーをどのように処理するかは、まったく別の問題です。それを検出した関数で処理する場合もあれば、それを呼び出した関数で処理する場合もあれば、アプリケーション レベルのスタックの最上部で処理する場合もあります。

例外 (使用されているプログラミング言語の構成要素) をキャッチすることと、意味のある例外処理 (使用されている言語に依存しない論理構成要素)の間には大きな違いがあることに注意してください。実際に対処できる例外のみをキャッチます。それ以外の場合は、それらに対して何かを実行できる他のコードにスタックをバブルアップさせます。(しかし、assertはエラーをキャッチしないので、エラーをスローします。使用しようとしている場所で正確に使用する必要があります...エラーを検出できるポイント、たとえそれを処理できない場合でも。)

を使用しようとしているのを見ると、assert近いようです。これは実際には正しい使い方ではありません:

assert (x > 0) ? "assertion failed" : "assertion passed";

assert単なるブール値であるかのように扱っています。そして、? :演算子を使用して、そのブール値をキーオフして...まあ...実際には何もしません。"assertion failed"文字列 (または"assertion passed") を、その文字列で何もしないコード行に返すだけです。

近いですが、完全ではありません。

それassert自体は、状態をチェックするだけではありません。エラーをスローするか、コード パスの続行を許可することで、条件に応答しています。演算子を使用しますが、:演算子の一部としては使用しません? :。だから私はあなたがやろうとしていることはこれだと思います:

assert (x > 0) : "assertion failed";

これは基本的に次のように言っています。

x は常に 0 より大きい必要があります。そうでない場合は、何かが非常に間違っています。何もしないでエラーを発生させます。

これAssertionErrorにより、メッセージとともに が発生します"assertion failed"(もちろん、デバッグに役立つように、検査されている値に関する有用な実行時情報を含む、より意味のある有用なメッセージに置き換えたいと思うでしょう)。

次に、他の場所でそれを処理しAssertionError、何らかの方法で応答します。

の使用は、次のassertようなものと非常によく似ていますが、より短く、その意図に対してもう少し表現力豊かです。

if (x <= 0) throw new CustomException("assertion failed");

ご覧のとおり、assertは次の点で少しすっきりしています。

  • 特定のキーワードを使用して、仮定の検証のみを目的として条件をチェックしているという事実に注意を喚起します。がそうしているif可能性もあれば、他の理由で新しいコード パスを分岐している可能性もあります。
  • 他のエラーとは別にフィルタリングできる特定のエラーをスローします。CustomException同じことを行うために a を使用することに注意してください。ただし、AssertionErrorより一般的に知られている/期待されている.
  • 少ないコードを使用します。
  • 逆条件または偽条件とは対照的に、真の条件を示します。ほとんどの場合、真の条件の方が読みやすく、コードの意図をより明確に表しています。
  • 慣例に従い、より慣用的です。
  • コードを残りのコードとは別に、特定の目的のためのものとして設定し、アサーションはアサーションのみであるべきであることを他の開発者に示します。(したがって、他の開発者は、アサーションに副作用を追加する可能性があるため、2 番目のコード パスとして変更しないでください。)
  • 実行中のアプリケーションに対してグローバルにオンまたはオフを非常に簡単に切り替えることができます。Java では、任意のランタイム コンテキストでアサーションのチェックを有効または無効にすることができます。これは、分野横断的な関心事としてアサーションをグローバルに管理するのに非常に便利です。
于 2012-11-04T12:54:11.047 に答える
0

Assert は、開発時にコードに関する仮定を検証するためのものです。

彼らは一種の貧乏人のデザインとして契約によって使用される傾向があります.

たとえば、コードの前後の条件と不変条件を検証するためにそれらを使用します。

于 2012-11-04T12:34:17.083 に答える