Java项目开发中使用BigDecimal实例及注意事项补充

去年写过一篇博客记录了日常项目开发中使用BigDecimal遇到的问题和注意事项:
Java项目日常开发中使用BigDecimal常见问题总结
今年在项目开发中又遇到了几个实例,这里补充记录下。

  1. BigDecimal初始化时入参使用String类型,如果不是数字会抛异常NumberFormatException
// java.lang.NumberFormatException
BigDecimal val = new BigDecimal("a");
System.out.println(val);

注:new BigDecimal("13.14 ");如果前后有空格同样会报错,在之前的博客有记录。

  1. 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.

  1. 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());
        }
    }
}
posted @ 2024-07-30 22:35  cdfive  阅读(47)  评论(0编辑  收藏  举报