ArithmeticException最典型场景是整数类型(int、long、short、byte)除以零或模零,立即抛出“/ by zero”;浮点数除零返回Infinity或NaN不抛异常;BigInteger和BigDecimal除零也抛该异常,消息更具体。

除零操作触发 ArithmeticException
Java 中最典型的 ArithmeticException 场景是整数类型的除零,比如 int、long、short、byte 作被除数时除以 0。注意:这和浮点数不同——double 或 float 除零不会抛异常,而是返回 Infinity 或 NaN。
-
10 / 0→ 立即抛出ArithmeticException: / by zero -
0 / 0→ 同样抛出/ by zero(不是NaN) -
10L / 0L、(short)5 / (short)0同样触发 -
Integer.MIN_VALUE / -1在某些 JVM 实现中也可能触发(溢出导致的未定义行为,但 OpenJDK 通常不抛此异常;不过明确写死该表达式时需警惕)
BigInteger 和 BigDecimal 的除零行为差异
这两个类的除法方法对零除的处理更严格,且异常类型仍是 ArithmeticException,但消息更具体:
-
BigInteger.divide(BigInteger.ZERO)→ArithmeticException: division by zero -
BigDecimal.divide(BigDecimal.ZERO)→ 同样抛division by zero(注意:若用带RoundingMode的重载,如divide(divisor, scale, RoundingMode),除零仍会抛异常,不因指定舍入模式而绕过) - 但
BigDecimal.divide(...)若分母非零但结果无限不循环(如1/3未指定精度),会抛ArithmeticException: Non-terminating decimal expansion—— 这也属于同一异常类,常被忽略
容易误判的“非算术”场景
有些看似数学的操作其实不会触发 ArithmeticException,反而可能抛其他异常或静默失败:
-
int x = Integer.parseInt("abc")→ 抛NumberFormatException,不是ArithmeticException -
Math.sqrt(-1.0)→ 返回NaN,不抛异常 -
new int[-1]→ 抛NegativeArraySizeException,继承自RuntimeException,但和算术无关 -
10 % 0(取模零)→ 和除零一样,抛/ by zero;但10.0 % 0.0返回NaN
public class Demo {
public static void main(String[] args) {
try {
System.out.println(5 / 0); // 触发
} catch (ArithmeticException e) {
System.out.println(e.getMessage()); // 输出 "/ by zero"
}
try {
System.out.println(new BigInteger("10").divide(BigInteger.ZERO));
} catch (ArithmeticException e) {
System.out.println(e.getMessage()); // 输出 "division by zero"
}
}
}
真正要留心的是:**整数除零必炸,浮点除零不炸,而 BigDecimal 除零和无限小数都归在同一异常下**。很多线上 ArithmeticException 其实来自没设精度的 BigDecimal.divide,而不是眼见的“除以零”。








