Java 算术异常:除法未定义

Java 算术异常:除法未定义,java,Java,我的程序中有一个简单的操作: exposureNoDecimals = BigDecimal.valueOf(curEffSpreadPremium).multiply(BigDecimal.valueOf(100)).divide(wsRate, 0, java.math.RoundingMode.HALF_UP).longValue(); exposureNoDecimals-长 Cureffly高级-长 wsRate-BigDecimal 然而,我得到 "java

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

exposureNoDecimals =
    BigDecimal.valueOf(curEffSpreadPremium).multiply(BigDecimal.valueOf(100)).divide(wsRate, 0,
        java.math.RoundingMode.HALF_UP).longValue();
exposureNoDecimals-长 Cureffly高级-长 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)
问题在于问题可在生产环境中重现,而不是在我的机器上重现(无法调试或无法查看输入)


这里有什么问题?有什么建议/想法吗?

请查看
BigDecimal
的源代码(例如)

当您尝试将0除以0时,仅会抛出带有消息“Division undefined”的
算术异常


我不打算建议修复,因为根据
BigDecimal
的源代码,
java.lang.arithmetricException:Division undefined
(不带is)只有在将零除以零时才会抛出>>正确的

在您的案例中,
curEffSpreadPremium
wsRate
都是零


因此,您需要使用零检查来保护线路。

这就是您需要日志的原因。请尝试使用log4j将错误消息记录在日志文件中。然后你可以看到这个错误发生的地方和原因。“未定义的除法”仅在0/0类型上抛出,但当我使用虚拟程序尝试0/0时,它会给出“/by 0 exception”,而不是未定义的除法。值得一提的是扩展跟踪:java.math.BigDecimal.longscaledvide(BigDecimal.java:3105)at java.math.BigDecimal.divide(BigDecimal.java:2409)位于java.math.BigDecimal.divide(BigDecimal.java:2396)的java.math.BigDecimal.divide(BigDecimal.java:2361)与当前Oracle源代码不匹配。没有
longscaledvide
方法。您必须使用不同的类库。(可能是Android?或者是真正古老的Sun Java版本?或者是IBM版本!)同意。“未定义的除法”仅在0/0类型上抛出,但当我使用虚拟程序尝试0/0时,它会给我“/by 0 exception”,而不是未定义的除法。
BigDecimal
支持两种不同的消息。一个用于
x/0
,另一个用于
0/0
。根据Bigdecimal代码:{public Bigdecimal More…divide(Bigdecimal除数){1581/*1582*首先处理零情况。1583*/1584 if(divisor.signum()=0){//x/0 1585 if(this.signum()=0)//0/0 1586抛出新的算术异常(“未定义的除法”);//NaN 1587抛出新的算术异常(“零除法”);1588}1589}所以当我执行0/0时,它应该抛出未定义的除法,但我得到的是0除法。是的,它应该这样做。也许这证明了Stackoverflow的一个新问题是正确的(请注意,如果没有确切的JDK版本号,JDK行号没有多大帮助)。但是从实际角度来看,要解决您的问题,您需要添加零检查。看起来我已经找到了为什么在服务器上(运行websphere)和/或在我的机器上(运行tomcat)没有定义除法的原因。获取了导致问题的数据,并且确实存在0/0,并且相同的数据在我的计算机上导致了/由零异常,分区未定义。看起来像是websphere为异常抛出自定义消息,或者更改了相同的情况?(另一个证据是我得到的是“分区未定义”,而不是“未定义的除法”:用bigdecimal代码编写)