ArithmeticException算术异常类在java.lang包下,继承RuntimeException运行期异常,算术异常类在Java1.0就有,当发生异常算术条件时抛出算术异常类,譬如除数为0的情况,除数除不尽的情况。
一 异常出现场景
1.1 除数为零
// 除数为0, 进行取值运算
@Test
public void test1() {
int a = 1;
int b = 0;
int result = a / b; //java.lang.ArithmeticException: / by zero
System.out.println("result is: " + result);
System.out.println("aaa");
}
// 除数为0, 进行取模运算
@Test
public void test2() {
int a = 1;
int b = 0;
int result = a % b; //java.lang.ArithmeticException: / by zero
System.out.println("result is: " + result);
System.out.println("aaa");
}
1.2 除数除不尽
// 除数除不尽
@Test
public void test3() {
BigDecimal bigDecimalOne = BigDecimal.valueOf(1);
BigDecimal bigDecimalTwo = BigDecimal.valueOf(3);
// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
// 非终止十进制扩展;没有可精确表示的十进制结果。
BigDecimal result = bigDecimalOne.divide(bigDecimalTwo);
System.out.println("result is: " + result);
System.out.println("aaa");
}
tips:整型和浮点型不存在除数除不尽的情况,但是浮点数除法运算有精度损失问题, 同时还要考虑整型和浮点型数据溢出问题
二 异常处理
2.1 处理除数为零
// 除数为0, 进行取值运算
@Test
public void test1001() {
int a = 1;
int b = 0;
// 除法运算需要对除数进行非零校验
if (b != 0) {
int result = a / b;
System.out.println("result is: " + result);
}
System.out.println("aaa");
}
// 除数为0, 进行取模运算
@Test
public void test1002() {
int a = 1;
int b = 0;
// 除法运算需要对除数进行非零校验
if (b != 0) {
int result = a % b;
System.out.println("result is: " + result);
}
System.out.println("aaa");
}
2.2 处理除数除不尽
// 除数除不尽
@Test
public void test1003() {
BigDecimal bigDecimalOne = BigDecimal.valueOf(1);
BigDecimal bigDecimalTwo = BigDecimal.valueOf(3);
// 除法运算需要对除数进行非零校验
if (bigDecimalTwo.compareTo(BigDecimal.ZERO) != 0) {
// 在除法运算中, 指定结果的精度和舍入模式
BigDecimal result = bigDecimalOne.divide(bigDecimalTwo, 2, RoundingMode.HALF_UP);
System.out.println("result is: " + result);
}
System.out.println("aaa");
}