当前位置: 首页 > 工具软件 > ExpAn > 使用案例 >

java.lang.NumberFormatException: null 和 java.lang.ArithmeticException: Non-terminating decimal expan

叶坚
2023-12-01

今天写java,后台报错

java.lang.NumberFormatException: null

报空参数异常,debug到报错的那句代码,发现他传入的参数b的值为空。
当你的代码报这个异常的时候,有两个解决思路:

  • 查看自己传入的参数是否为空
  • 查看自己是否粗心写错了参数名
//a是被除数,b是除数
//b传入参数为空
//c=(a-b)/b
BigDecimal a = new BigDecimal(String.valueOf(map.get("a")));
BigDecimal b = new BigDecimal(String.valueOf(map.get("b")));
BigDecimal c= (a.subtract(b)).divide(b);  

自己阅读自己的代码,发现有一个地方的参数名错了,本来传入因为b的,我写成了d,修改一下,运行!
卧槽怎么报错了?
阅读报错信息,报除0错误,b是除数,传入参数不能为0

//a是被除数,b是除数
//b传入参数0
//c=(a-b)/b
BigDecimal a = new BigDecimal(String.valueOf(map.get("a")));
BigDecimal b = new BigDecimal(String.valueOf(map.get("b")));
BigDecimal c= (a.subtract(b)).divide(b);      

好了,原来是之前的语句用BigDecimal做了一个除法,除数为0,除0错误,传到这里也就报0异常,给他做一个除数不为0的判断

BigDecimal c;
   if (b.equals(BigDecimal.ZERO)){
        c=BigDecimal.ZERO;
       }
        else {
  		c=(a.subtract(b)).divide(b);
            }

修改完成!运行!
卧槽怎么还是报错???

java.lang.ArithmeticException: Non-terminating decimal expansion;
 no exact representable decimal result。

阅读后台报错,还是回到这一句

c=(a.subtract(b)).divide(b);

一番查阅,发现原来使用JAVA中如果用BigDecimal做除法时后面要接第二个参数,以限定其精确到小数点后第几位,否则就会无限除下去
修改如下:

//精确到2位
 c=(a.subtract(b)).divide(b,2,BigDecimal.ROUND_HALF_UP);

关于 BigDecimal.ROUND_HALF_XX 的用法查看一下这位博主写的,很详细
https://www.cnblogs.com/yingchen/p/5459501.html

注意这个BigDecimal的divide方法有两个重载的方法,一个是传两个参数的,一个是传三个参数的:

  • 当传入两个参数时,传入的是(除数,round的模式)

  • 当传入两个参数时,传入的是(除数,精度,round的模式)

参考链接:

https://www.jianshu.com/p/ed9a2d3107d3

https://www.cnblogs.com/yingchen/p/5459501.html

 类似资料: