背景
在对 Double 类型的数据进行计算操作, 将结果转化为 BigDecimal 时抛出了下面的异常, 进行了 Debug 才发现了问题原因, 同时也暴露出了自己在一些基础知识上还有些欠缺.
- Exception in thread "main" java.lang.NumberFormatException: Infinite or NaN
- at java.math.BigDecimal.<init>(BigDecimal.java:895)
- at java.math.BigDecimal.<init>(BigDecimal.java:872)
- at com.lingyejun.authenticator.DoubleTest.main(DoubleTest.java:13)
概念补充
在 java 中进行数字类型运算的时, 之前一直有一种错误的观念, 即进行除法运算时当除数为 0 时在运行时会抛出 java.lang.ArithmeticException: / by zero 运行时异常. 如此想当然的以为对于浮点类型如 Float 和 Double 也是如此, 下面一段代码便可以说明问题.
- package com.lingyejun.authenticator;
- public class DoubleTest {
- public static void main(String[] args) {
- Double d1 = 10 / 0D;
- Double d2 = -10 / 0D;
- Double d3 = 0.0 / 0D;
- System.out.println("d1=" + d1 + "d2=" + d2 + "d3=" + d3);
- }
- }
运算结果为 "d1=Infinity d2=-Infinity d3=NaN", 什么? 数字运算居然还能算出来了字符串??? 打印出来的 Infinity,-Infinit,NaN 其实不是字符串, 而是 double 类型的常量, 查看源码注释便懂了.
- /**
- * A constant holding the positive infinity of type
- * {@code double}. It is equal to the value returned by
- * {@code Double.longBitsToDouble(0x7ff0000000000000L)}.
- */
- public static final double POSITIVE_INFINITY = 1.0 / 0.0;
- /**
- * A constant holding the negative infinity of type
- * {@code double}. It is equal to the value returned by
- * {@code Double.longBitsToDouble(0xfff0000000000000L)}.
- */
- public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
- /**
- * A constant holding a Not-a-Number (NaN) value of type
- * {@code double}. It is equivalent to the value returned by
- * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
- */
- public static final double NaN = 0.0d / 0.0;
正无穷: POSITIVE_INFINITY, 正数除以零得到正无穷.
负无穷: NEGATIVE_INFINITY, 负数除以零得到负无穷.
非数字: NaN,0 除以 0 时得到非数字.
异常原因
通过查看 BigDecimal 类中针对 Double 类型数据的构造方法, 我们知道了, 在构造 BigDecimal 对象时, 构造方法中传入的 Double 类型为无穷大或非数字时会抛出 NumberFormatException 异常.
- public BigDecimal(double val, MathContext mc) {
- if (Double.isInfinite(val) || Double.isNaN(val))
- throw new NumberFormatException("Infinite or NaN");
拨云见日探究清楚之后, 一切都是那样的理所应当.
来源: http://www.bubuko.com/infodetail-3128649.html