java.lang.ArithmeticException:除法未定义

时间:2015-12-17 07:45:55

标签: java

我的程序中有一个简单的操作:

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 个答案:

答案 0 :(得分:13)

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

ArithmeticException只会抛出消息" Division undefined"当你试图将零除零时。

我不会建议修复,因为>>正确<<修复将取决于此计算应该做什么,以及为什么除数/被除数恰好为零。进行一些零检查可能是一个解决方案,但它也可能是一个“创可贴”解决方案"隐藏问题而不是修复它。它可能会在以后回来咬你。

答案 1 :(得分:1)

根据BigDecimal的源代码,java.lang.ArithmeticException: Division undefined(没有)仅在零归零时抛出。

在你的情况下curEffSpreadPremium wsRate看起来都是零。

所以你需要用零检查来保护线路。