ArithmeticException仅在整数类型(int、long、short、byte)除法或取模除零时抛出;浮点数除零返回Infinity或NaN,不抛异常;应优先校验分母非零而非依赖try-catch。

Java中的算术异常(ArithmeticException)主要在整数运算中发生非法操作时抛出,最典型的是整数除以零。它属于运行时异常(RuntimeException),无需强制捕获,但若未处理会导致程序中断。
什么情况下会触发ArithmeticException
该异常仅在**整数类型**(int、long、short、byte)的除法或取模运算中出现除零行为时抛出。浮点数(float、double)除以零不会抛异常,而是返回Infinity或NaN。
-
int a = 5 / 0;→ 抛出ArithmeticException: / by zero -
int b = 10 % 0;→ 同样抛出异常 -
double c = 5.0 / 0.0;→ 返回Infinity,不抛异常 -
int d = Integer.MIN_VALUE / -1;→ 在某些JVM版本中可能触发(溢出导致的未定义行为,但Java规范不保证抛此异常;实际中一般不会)
如何正确捕获和处理
虽然不是必须捕获,但在涉及用户输入、配置值或外部数据的除法场景中,应主动预防。推荐先校验分母是否为零,而非依赖try-catch——更高效且语义清晰。
- 优先使用条件判断:
if (divisor != 0) { result = dividend / divisor; } - 若逻辑上需统一错误处理,再用
try-catch:
try {
int result = 100 / userInput;
} catch (ArithmeticException e) {
System.err.println("除数不能为零,请检查输入");
}
常见误区提醒
很多人误以为所有“数学错误”都会触发该异常,其实不然:
立即学习“Java免费学习笔记(深入)”;
- 空指针、数组越界、类型转换失败等,分别抛
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException,和ArithmeticException无关 -
Math.sqrt(-1)返回NaN,不抛异常 - 大数运算(如
BigInteger)中除零会抛ArithmeticException,这是特例,因其实现明确约定
自定义场景中的预防建议
在工具方法或API中处理除法时,可封装安全除法逻辑:
- 返回
Optional表示可能无结果 - 提供默认值:如
safeDivide(10, 0, 1)返回1 - 日志记录异常上下文,便于排查来源(例如哪个参数为零、来自哪次请求)










