Java整数除零抛ArithmeticException,因数学未定义而被JVM主动拒绝执行,必须预防而非依赖catch恢复;浮点数除外,结果为Infinity或NaN。

Java 中整数除零会直接抛出 ArithmeticException,这是运行时异常(RuntimeException),编译期不强制要求处理,但一旦发生程序会中断。关键在于:它无法通过 try-catch「优雅恢复」,而应从逻辑上避免发生。
为什么整数除零不能被“正常捕获并继续”?
Java 规范明确规定,对 int、long 等整数类型执行 / 或 % 时若除数为 0,JVM 必须抛出 ArithmeticException。这不是系统错误,而是语义非法——数学上未定义,JVM 主动拒绝执行。
- 该异常继承自
RuntimeException,所以不需要声明 throws,也不强制 try-catch - 即使你写了 try-catch,也只适合记录日志或降级处理(如返回默认值),不能“修复”除零本身
- 浮点数(
double/float)除外:除零结果是Infinity或NaN,不抛异常
推荐做法:预防优于捕获
真正健壮的代码不是靠 catch 弥补漏洞,而是确保除数永远不为 0。
- 在执行除法前显式校验:
if (divisor != 0) { result = dividend / divisor; } - 对用户输入、配置值、数据库字段等外部数据,必须做非零判断,不能假设“它应该不为零”
- 使用工具方法封装安全除法,例如:
public static int safeDivide(int a, int b) { return b == 0 ? 0 : a / b; }(按业务约定返回默认值)
什么时候可以考虑 try-catch?
仅限以下场景:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 除数来源复杂、校验成本高(如多层嵌套表达式),且你明确接受“失败即异常”的语义
- 需要统一异常处理机制(如 Spring 的 @ControllerAdvice 捕获所有 ArithmeticException 并转为 HTTP 400)
- 日志审计:记录哪次调用、什么参数导致了除零,用于后续排查
示例:
try {
int result = a / b;
} catch (ArithmeticException e) {
log.warn("Integer division by zero: {}/{}", a, b);
throw new BusinessException("计算参数异常");
}
注意边界情况
容易忽略的“隐式零”:
- 变量未初始化(基本类型默认为 0,如
int b;在成员变量中就是 0) - 方法返回值未校验,例如
getConfig().getTimeout()返回 0 - 负数取模:
-5 % 0同样抛异常,不只是正数 - 常量折叠无风险:
10 / 2编译期算好;但10 / 0编译报错(字节码层面禁止)

















