arithmeticexception仅在整数类型(int/long/short/byte)除零或模零时抛出,浮点数运算不会触发;处理应以预防为主,通过前置校验避免,必要时捕获并记录日志或抛业务异常。

Java 中 ArithmeticException 主要在整数除零(如 5 / 0)或对整数取模零(如 10 % 0)时抛出,浮点数除零不会触发该异常(结果为 Infinity 或 NaN)。处理核心是:**提前校验、合理捕获、避免掩盖逻辑错误**。
明确触发条件,避免误用
这个异常只在 整数类型(int, long, short, byte)执行除零或模零时发生。注意以下几点:
-
double a = 5.0 / 0.0;不会抛异常,结果是Infinity -
int b = 5 / 0;运行时立即抛出ArithmeticException -
BigInteger的divide方法除零也会抛此异常(非基本类型但行为一致) -
BigDecimal除零则抛java.lang.ArithmeticException: Division by zero(同名但属于不同类库)
推荐做法:预防优于捕获
多数情况下,除数为零反映的是业务逻辑缺陷,应优先通过校验规避,而不是依赖 try-catch:
- 在执行除法前判断除数是否为零:
if (divisor != 0) { result = dividend / divisor; } - 对用户输入、配置值、数据库字段等外部数据,必须做空值和零值检查
- 封装安全除法工具方法:
public static int safeDivide(int a, int b) { return b == 0 ? 0 : a / b; }
(返回默认值或抛自定义业务异常更清晰)
必要时捕获并明确处理
仅当除数来源不可控且无法前置校验(如解析动态表达式、脚本引擎计算),才考虑捕获:
- 不要空 catch:
catch (ArithmeticException e) { }会隐藏问题 - 记录日志并提供上下文:
log.warn("Division by zero at calculation: {}/{}", a, b, e); - 根据场景返回默认值、抛带语义的业务异常(如
InvalidInputException),或中断流程 - 避免在 finally 中覆盖异常,也不要用它处理“预期中的零”——那说明设计需要调整
注意编译期 vs 运行期
Java 编译器能检测常量除零(如 int x = 5 / 0;),直接报错;但变量参与的运算只能在运行时发现。因此单元测试中要覆盖除数为零的用例,确保防御逻辑生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











