2016-05-13 5 views
-2

私は二重の値を生成するプログラムを持っています。私の結果の中には、NaNがありますが、これは起こりそうにないので、コードNaNがどこに割り当てられているか知りたいと思います。 私はプログラムのすべてのステップでDouble.isNaNを強制的にテストしたくないです。最善のシナリオは、ヌルオブジェクトからメソッドを呼び出そうとしたときにNaN値が割り当てられたときに例外がスローされるようにする方法です。Javaプログラム全体のNaN割り当ての検出

編集:はい、明らかに私の質問は明確ではありませんでした。 私のプログラムは、二重の値を持つオブジェクトを作成します。これらの値は、オブジェクトを操作するいくつかの方法のおかげで、何百万という時間に変更されます。問題は、値を変更するすべてのメソッドで値がNaNであるかどうかを確認しなければならないか、またはプログラム全体でNaNが割り当てられたときに検出する方法があるかどうかです。

+0

私はかなり分かりません。ダブル・ジェネレーションをループすることはできません:生成されたNaNの間にdoubleを生成しますか? –

+0

非常にスマートな方法で*テストデータを生成するクイックチェックのようなツールがあります。おそらく、それを使って演算がNaNに計算されることを明らかにする特別な単体テストを書くことができます。 – GhostCat

答えて

2

これには迅速な解決策はありません。 nullのデータをチェックするのと同じ方法で、Double.isNaNを使用する必要があります。

どこでも小切手を使わないというのは、「フェイル・ファースト」アプローチを容易にするためのいくつかの「戦略的スポット」に置くことです。たとえば、あなたがそれらでdouble Sを持つオブジェクトを構築する場合は、コンストラクタにチェックを追加します。

private final double val; 
public MyObject(double val) { 
    if (Double.isNaN(val)) { 
     throw new IllegalArgumentException(); 
    } 
    this.val = val; 
} 

あなたが適切にあなたのデータをカプセル化し、道に沿ってパラメータチェックを行う場合は、あなたのコードは、トラップNaN sのことができるはずですそれらが設定されている場所にかなり近く、問題の診断と修正に役立ちます。

関連する問題