前言
记一次这两天碰到的问题,当时在网上搜了一下报错,帖子一堆但是都不解决问题,然后没办法只能自己看一下这个错。这里给出一个错误的解释,和解决办法。
一、问题
在flinksql中有一个除法计算,运行在内存之后报了如下的错误。
Exception in thread "main" java.lang.ArithmeticException: Division undefined
at java.base/java.math.BigDecimal.divide(BigDecimal.java:1696)
at com.luban.Test.main(Test.java:21)
二、问题定位
找到抛异常的代码,发现这里有两个判断,当这个双层if判断都成立时就会抛出这个异常。
查看方法signum() 注释信息可以知道,这个方法返回的值有如下规则。
- 1.如果数字>0返回值为1
- 2.如果数字=0返回值为0
- 3.如果数字<0返回值-1
在结合方法入参和另一个异常,我们可以得到如下结论。
- 1.分母=0,分子!=0.抛出异常 Division by zero
- 2.分母=0,分子=0.抛出异常 Division undefined
三、验证结论
BigDecimal bigDecimal2 = new BigDecimal("1000");
BigDecimal bigDecimal3 = new BigDecimal("0");
(1)
System.out.println(bigDecimal2.divide(bigDecimal3));
BigDecimal bigDecimal4 = new BigDecimal("0");
(2)
System.out.println(bigDecimal4.divide(bigDecimal3));
经过运行,在代码(1)(2)处分别抛出异常,且符合结论。
四、解决方法
根据上面的定位和验证,如果在碰到这中报错时,直接对分母增加判空就能解决次此问题。