arithmeticexception 主要由整数除零、溢出及 bigdecimal 无舍入除法引发,属运行时异常;防御重在前置校验而非事后捕获:除法须判零,溢出宜用 math.exact 方法,bigdecimal 除法必指定舍入模式,余数需按业务归正。

算术异常(ArithmeticException)在 Java 中主要由整数除零、整数溢出、BigDecimal 无舍入除法等引发。它属于运行时异常,不强制捕获,但一旦抛出即中断执行。真正有效的防御不是靠 try-catch 补救,而是在计算发生前就切断风险路径。
除法运算:分母为零必须前置拦截
整数除法(/ 和 %)对零分母零容忍,浮点数则返回 Infinity 或 NaN,不抛此异常——所以重点盯紧 int 和 long 类型的除法。
- 所有来自用户输入、配置文件、数据库或外部接口的除数,在参与运算前必须显式校验:
if (divisor != 0) - 避免写成
result = a / b;后再处理异常;应把判断逻辑放在计算之前,保持流程清晰、性能可控 - 在量化、金融、报表等业务系统中,可封装安全除法工具方法,如
safeDivide(int a, int b, int defaultValue),内部统一判零并返回兜底值
整数溢出:用内置安全方法替代裸乘除
普通 *、+、- 运算发生溢出时静默截断,结果不可信;而 Math.multiplyExact()、addExact()、subtractExact() 等会在溢出时立即抛 ArithmeticException,实现 fail-fast。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 仅支持
int和long,使用时确保参数类型匹配;short/byte需先转int - 推荐配合
try-catch做差异化处理:例如降级为BigInteger、记录告警、返回默认值或拒绝请求 - 不要忽略异常或仅打印堆栈;若上下文已严格限制输入范围(如枚举 ID 相乘),也可不捕获,让异常暴露设计漏洞
BigDecimal 计算:除法必须指定精度与舍入模式
BigDecimal.divide() 若未提供舍入参数,遇到除不尽(如 1.divide(3))会直接抛 ArithmeticException,这是最易被忽视的触发点。
- 一律使用三参数重载:
divide(divisor, scale, roundingMode) - 根据业务选择舍入方式:金融场景常用
RoundingMode.HALF_UP,统计类可用RoundingMode.HALF_DOWN - 避免硬编码小数位数;可提取为配置项或常量,便于审计和调整
取模与负数:注意 Java 的余数定义
Java 中 % 是“余数”而非“模”,-5 % 2 == -1。若业务逻辑依赖非负余数(如哈希分片、循环索引),需手动归正。
- 通用归正写法:
((a % b) + b) % b,适用于任意整数a和正整数b - 对
b 的情况,应提前校验并拒绝,避免无效计算 - 在工具类中封装
mod(int a, int m)方法,隐藏细节,提升复用性与一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










