2016-05-13 22 views
-2

我有一個程序可以生成雙精度值。我的一些結果是不應該發生的NaN,我想知道NaN代碼分配的位置。 我不想被迫在程序的每一步測試Double.isNaN。最好的情況是有一種方法,當你嘗試從一個空對象調用一個方法時,就像完成NaN值一樣拋出一個異常。在整個Java程序中檢測NaN分配

編輯:很明顯,我的問題顯然不清楚。 我的程序創建具有double值的對象。由於操縱對象的幾種方法,這些值被改變了數百萬次。問題是,我不得不檢查每個修改該值的方法中的值是否爲NaN,或者是否有方法檢測NaN何時分配給整個程序。

+0

我完全不明白。難道你不能只循環雙代:生成時生成雙是NaN? –

+0

有很多像quickcheck這樣的工具能以非常聰明的方式生成測試數據。也許你可以使用它來編寫特殊的單元測試,以揭示哪些操作最終將計算成NaN。 – GhostCat

回答

2

沒有快速的解決方案。您確實需要使用Double.isNaN,與您檢查null的數據的方式相同。

不做檢查的訣竅就是把它們放在一些「戰略點」上,以促進「快速失敗」的方法。例如,如果您構建在他們有double的S對象,增加檢查的構造器:

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

如果你正確封裝您的數據和做參數沿途檢查,你的代碼應該能夠捕獲NaN小號非常接近他們正在設置的位置,幫助您診斷和解決問題。