前言
之前一直以为Java中如果出现被除数为0
时,只会出现抛出ArithmeticException
这个异常,但是有次无意中发现被除数为double
时却不会抛出异常。于是就准备了一些测试用例研究一下。本人使用的JDK版本为1.8.0_162
。
用例
整数类型
被除数为byte
、short
、int
、long
时,测试用例如下所示(只展示int
的代码)
int a=1;
int b=0;
System.out.println(a/b);
运行结果为
java.lang.ArithmeticException: / by zero
...此处省略堆栈信息
浮点数类型
被除数为float
、double
时,测试用例如下所示(只展示double
的代码)
double a=1;
double b=0;
System.out.println(a/b);
运行结果为
Infinity
Infinity
是无限大的意思。
BigDecimal
被除数为BigDecimal
时,测试用例如下
System.out.println(BigDecimal.ONE.divide(BigDecimal.ZERO));
运行结果为
java.lang.ArithmeticException: Division by zero
...此处省略堆栈信息
结论
通过一系列的测试可以得知,当运算中遇到除以0的情况时,基本类型中的整数类型和BigDecimal
会直接抛出ArithmeticException
。而基本类型中的浮点数类型时会返回Infinity
。
关于Infinity的拓展知识
Infinity
其实是个double
类型的常量。Infinity
并不是在rt.jar
中定义的。而是nashorn.jar
中的jdk.nashorn.internal.objects.Global
中定义的常量。其定义的源码如下:public static final double Infinity = 1.0D / 0.0;
- 可以直接给
double
类型的变量赋值,如:double d=Infinity;