web-dev-qa-db-ja.com

アサーションが機能しない

ユーザーが指定したサイズが正の値であるかどうかを確認するアサーションを記述しようとしています。そうでない場合は、正の値にします。このステートメントは、サイズの値を取得してarray [size]を作成するクラスコンストラクター内にあります。私は私が正しいと思う以下のコードを書きました。

    public Grid(int size) {


    try{
        assert size > 0 ;
    }
    catch(AssertionError e){
        size = Math.abs(size);
    }

    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

アサーションを評価してプログラムを続行することはないようですが、NegativeArraySizeエラーが発生します(これを回避しようとしています)。

私も試してみました

assert size>0;

そして、プログラムは負の値のために停止しません。

私は最近、Javaを実行することでいくつかの問題を抱えていたので、私のコードが正しいのか、それともそれらの奇妙なMacの癖の1つにすぎないのかわかりません!

size=Math.abs(size);

ありがとうサム、

31
Sam Palmer

-eaスイッチ(アサーションを有効にする)を使用してプログラムを実行する必要があります。そうしないと、JVMによってassert命令がまったく実行されません。アサートに依存することは少し危険です。私はあなたがこのようなことをすることを勧めます:

public Grid(int size) {
    size = Math.max(0, size) 
    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

または次のようにも:

public Grid(int size) {
    if(size < 0) {
        throw new IllegalArgumentException("cannot create a grid with a negative size");
    } 
    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

2番目の提案には、コードの他の部分の潜在的なプログラミングエラーを表示するという利点がありますが、1番目の提案は暗黙的にそれらを無視します。これは、ユースケースによって異なります。

51
Matt

アサーションは、プログラムの起動時に有効または無効にすることができ、デフォルトでは無効になっています。

アサーションの有効化と無効化を参照してください

つまり、システムクラスを除くすべてのクラスでアサーションを有効にするには、-enableassertions、または-ea、クラスを実行するときに切り替えます。

12
stivlo

AssertはJDK 1.4で導入された新しいJavaキーワードなので、JDK 1.4コンパイラを使用してプログラムをコンパイルする必要があります。さらに、次のようにコンパイラコマンドにスイッチ-source 1.4を含める必要があります。 :

javac –source 1.4 AssertionDemo.Java

注:JDK 1.5以降を使用する場合、コマンドで-source 1.4オプションを使用する必要はありません。

デフォルトでは、アサーションは実行時に無効になっています。これを有効にするには、次のようにスイッチ– enableassertions、または略して– eaを使用します。

Java –ea AssertionDemo

アサーションは、クラスレベルまたはパッケージレベルで選択的に有効または無効にできます。無効化スイッチは– disableassertionsまたは– daです。

たとえば、次のコマンドはパッケージpackage1でアサーションを有効にし、クラスClass1でアサーションを無効にします。

Java –ea:package1 –da:Class1 AssertionDemo

例外処理の代わりにアサーションを使用しないでください。例外処理は、プログラム実行中の異常な状況を扱います。アサーションは、プログラムの正確さを保証することです。例外処理は堅牢性に対処し、アサーションは正確性に対処します。例外処理と同様に、アサーションは通常のテストではなく、内部の整合性と有効性のチェックに使用されます。

したがって、この場合、最良の答えは例外処理です。

パブリックメソッドの引数チェックにアサーションを使用しないでください。 publicメソッドに渡される可能性のある有効な引数は、メソッドのコントラクトの一部と見なされます。契約は、アサーションが有効であるか無効であるかにかかわらず常に従う必要があります。たとえば、上記のコードは例外処理を使用して書き直す必要があります

2
dulaj sanjaya