Java项目开发中使用BigDecimal实例及注意事项补充
去年写过一篇博客记录了日常项目开发中使用BigDecimal
遇到的问题和注意事项:
Java项目日常开发中使用BigDecimal常见问题总结
今年在项目开发中又遇到了几个实例,这里补充记录下。
BigDecimal
初始化时入参使用String
类型,如果不是数字会抛异常NumberFormatException
// java.lang.NumberFormatException
BigDecimal val = new BigDecimal("a");
System.out.println(val);
注:new BigDecimal("13.14 ");
如果前后有空格同样会报错,在之前的博客有记录。
BigDecimal
初始化时入参使用Double
类型,如果值为null
会抛异常NullPointerException
// java.lang.NullPointerException
Double d = null;
BigDecimal val = new BigDecimal(d);// unboxing
System.out.println(val);
注:因为BigDecimal(double val)
构造函数,这里Double
会进行拆箱,转换为double
,因此出现NPE
.
BigDecimal
初始化时入参使用double
类型,如果值为NaN
会抛异常NumberFormatException
。
// java.lang.NumberFormatException
double d = 0 / 0d; // NaN
BigDecimal val = new BigDecimal(d);
System.out.println(val);
注:这里入参就是double
类型,不会像实例2那样拆箱,但这里double
的值非法,NaN
表示not a number
,
通过BigDecimal
构造函数,内部解析会失败,最终抛异常NumberFormatException
。
完整代码如下:
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
/**
* @author cdfive
*/
public class BigDecimalTest4 {
public static void main(String[] args) {
case1();
System.out.println(StringUtils.center("分隔线", 50, "-"));
case2();
System.out.println(StringUtils.center("分隔线", 50, "-"));
case3();
}
private static void case1() {
// java.lang.NumberFormatException
try {
BigDecimal val = new BigDecimal("a");
System.out.println(val);
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
}
private static void case2() {
// java.lang.NullPointerException
try {
Double d = null;// unboxing
BigDecimal val = new BigDecimal(d);
System.out.println(val);
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
}
private static void case3() {
// java.lang.NumberFormatException
try {
double d = 0 / 0d; // NaN
BigDecimal val = new BigDecimal(d);
System.out.println(val);
} catch (Exception e) {
System.out.println(e.getClass().getName());
}
}
}