web-dev-qa-db-ja.com

正しい使用Java "assert"キーワード

assertが何のために使用されているのか理解できませんでした。たとえ多くの例を読んだとしても、何のために何を使用すべきなのかを本当に教えてくれません。

したがって、例を尋ねる代わりに、例を提供し、これがassertの適切な使用方法であるかどうかを知らせます。

// The idea is that the `mode` variable should be 0 or 1, and no other number.
switch(mode) {
     case 0: 
          // do stuff
          break;
     case 1:
          // do other stuff
          break;

     default:
          // assert code?
}

これが正しい場合は、この場合の使用方法を教えてください。これが使用方法と異なる場合は、例を提供してください。

15

この場合ではありません。

値をアサートしている場合、この値を使用していくつかの重要な評価が行われる前に、それがあなたがアサートするものであることを宣言します。値がnullではないこと、2より小さいこと、または何かbeforeが重要なコードブロックに到達したことをアサートできます。

assert (mode >= 0 && mode < 2);  // Ensures that `mode` is between 0 and 1.
// Switch statement to follow

ここではその使用をお勧めしません。あなたのコードはうまく読めず、-eaフラグでアサーションを有効にしない限り、アサーションは機能しません。

代わりに、できることはある種の例外をスローすることです-0または1でない場合、modeは処理できない不正な値であり、例外的/未定義の動作につながります。ある種の例外をスローします。

switch(mode) {
    case 0: 
        // do stuff
        break;
    case 1:
        // do other stuff
        break;
    default:
      throw new IllegalArgumentException("Mode is illegal");
}
19
Makoto
assert object != null;
object.doSomething();

assertは、前提条件、不変条件、または事後条件の正当性を検証するために使用されます。この例では、何らかのメソッドが呼び出されたときにobjectnullでないことを確認したいと思います。

覚えておくべきことの1つは、assertを実動コードで実行しないでください。テスト時にのみ使用します。オンまたはオフにするJavaオプションがあります。

具体的な例として、次を使用できます。

assert mode == 0;
assert mode == 1;

switchブロックの最初に01のみが渡されるようにします。

追伸 アサーションと例外をいつ使用するか に関する説明は、理解に役立つ場合があります。アイデアは

例外はアプリケーションの堅牢性に対処し、アサーションはアプリケーションの正確性に対処します。

8
Terry Li

アサーションは基本的に、決して起こらないことを確認するために使用されます。一部のアサーションでは、 http://www.javapractices.com/topic/TopicAction.do?Id=102 のケースを使用しています

前提条件(プライベートメソッドのみ)-メソッドが呼び出し元を満たすために必要な要件。事後条件-メソッドが呼び出し側クラスの不変式に対して行った約束を検証します-実行時の到達不可能なオブジェクト状態コードを検証します-到達できないと予想されるが、コンパイル時に検証できないプログラムの部分(多くの場合、else節およびswitchステートメントのデフォルトのケース)

したがって、コードでのアサーションの使用は正しくありません

4
Rami