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());
}
}
}

浙公网安备 33010602011771号