java.lang.ArithmeticException: Division undefined

前言
记一次这两天碰到的问题,当时在网上搜了一下报错,帖子一堆但是都不解决问题,然后没办法只能自己看一下这个错。这里给出一个错误的解释,和解决办法。

一、问题

在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)处分别抛出异常,且符合结论。

四、解决方法

根据上面的定位和验证,如果在碰到这中报错时,直接对分母增加判空就能解决次此问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值