2011-03-02 71 views
2

我有一個相當複雜的項目,涉及大量的計算。現在我有一個結果是NaN的情況。由於計算中涉及很多類(NaN傾向於像殭屍一樣傳播),所以難以確定原點。Eclipse:停止在Notanumber

現在我想知道,有沒有人知道一種方法來使eclipse調試器停止執行命中NaN?由於Java不支持在NaN上自動引發異常,這很難,但也許已經完成了,我錯過了它?

感謝, 阿克塞爾

PS:我知道我可以在Double.isNaN(value)添加條件斷點(或if語句),但我會在很多地方這樣做。 (事實上​​,這就是我現在要做的事。)只是想知道是否有更好的選擇。

回答

2

現在我想知道,有沒有人知道一種方法,使eclipse調試器停止執行命中NaN?

我對此表示懷疑。

由於正常的Java行爲是在NaN出現時不會拋出異常,因此調試器需要在每個可能生成一個的語句處插入條件斷點。這在實施過程中會變得很複雜並且在運行時很昂貴。你的用例是非常不尋常的。

我認爲一個更好的方法可能是在幾個精心挑選的地方向代碼添加Java斷言。

+0

到目前爲止最好的解決方案:在不同的地方添加assert!Double.isNaN(value),並在java.lang.AssertionError上添加一個異常斷點,這與我所尋找的非常接近。 – Axel

0

我不認爲有更簡單的方法。另外,完整的IEEE-754(2008)標準有一個「異常處理」機制(與Java/C#/ etc例外無關)。有5個例外:

  1. 無效操作
  2. 被零除
  3. 溢出
  4. 下溢
  5. 結果不精確

該規範還對每一個默認的異常處理策略這些例外情況如下:

  1. 替換爲NaN
  2. 替代的(approriately簽名)無窮
  3. 替代的(approriately簽名)無窮
  4. 忽略
  5. 忽略

該標準還建議該用戶是能夠使用另一個異常處理策略(提供了多個)或者使用特定於自定義語言的策略(例如在Java中拋出Exception)來覆蓋這些默認值。

不幸的是,幾乎所有的現代語言都完全忽略了這部分規範,並假設默認的異常處理策略是「足夠好」的。