2015-12-17 15 views
6

我有一個簡單的操作,我的程序怎麼回事:java.lang.ArithmeticException:司是未定義

exposureNoDecimals = 
    BigDecimal.valueOf(curEffSpreadPremium).multiply(BigDecimal.valueOf(100)).divide(wsRate, 0, 
     java.math.RoundingMode.HALF_UP).longValue(); 

exposureNoDecimals - 長 curEffSpreadPremium - 長 wsRate - BigDecimal的

不過我正在

"java.lang.ArithmeticException: Division is undefined" 
    at java.math.BigDecimal.longScaledDivide(BigDecimal.java:3105) 
    at java.math.BigDecimal.divide(BigDecimal.java:2409) 
    at java.math.BigDecimal.divide(BigDecimal.java:2396) 
    at java.math.BigDecimal.divide(BigDecimal.java:2361) 

問題是這個問題可以在生產環境中調用,而不是在我的機器上調試(無法調試,或者無法查看輸入)

這裏有什麼問題?任何建議/想法?

+2

這就是爲什麼你需要日誌。 – Maroun

+0

嘗試使用log4j在日誌文件中記錄錯誤消息。然後你可以看到這個錯誤發生的位置和原因 –

回答

9

查看BigDecimal的源代碼(例如here)。

只有當您嘗試將零除零時,纔會拋出消息「未定義分區」的ArithmeticException

我不打算提出修復方案,因爲>>正確的<修復將取決於計算應該做什麼,以及爲什麼除數/除數恰好爲零。進行一些零檢查可能是一種解決方案,但它也可能是一種「隱形問題解決方案」,它隱藏了問題而不是修復問題。它可能會在稍後回來咬你。

+0

同意。 「未定義的分區」僅在0/0類型中引發,但當我使用虛擬程序嘗試0/0時,它給了我「/ by 0異常」,而不是分割未定義。 – CHS

+0

值得一提的是擴展跟蹤:java.math.BigDecimal.longScaledDivide(BigDecimal.java:3105)java.math.BigDecimal.divide(BigDecimal.java:2409)java.math.BigDecimal.divide(BigDecimal.java: 2396)在java.math.BigDecimal.divide(BigDecimal.java:2361) – CHS

+0

這與當前的Oracle源代碼不匹配。沒有'longScaledDivide'方法。您必須使用不同的類庫。 (也許是Android?或者是Sun Java的真正古老版本?或IBM版本!) –

1

BigDecimaljava.lang.ArithmeticException: Division undefined源代碼(不)當您除以零零隻拋出。

看起來像你的情況curEffSpreadPremiumwsRate都是零。

所以你需要保持零檢查線。

+0

同意。 「未定義的分區」僅在0/0類型中引發,但當我使用虛擬程序嘗試0/0時,它給了我「/ by 0異常」,而不是分割未定義。 – CHS

+0

'BigDecimal'支持兩種不同的消息。一個用於'x/0'和一個用於'0/0'。 – hendrik

+0

根據Bigdecimal代碼: { public BigDecimal更多... divide(BigDecimal除數){ 1581/* 1582 *首先處理零個案例。如果(divisor.signum()== 0){// x/0 1585 if(this。 1583 */ 1584 ifsignum()== 0)// 0/0 1586拋出new ArithmeticException(「Division undefined」); // NaN 1587拋出新的ArithmeticException(「除零除」); 1588} } 所以當我做0/0。它應該扔分部未定義,但相反,我得到的除數爲0. – CHS