应前置校验分母是否为零,而非依赖ArithmeticException捕获;对double类型除零不抛异常却返回Infinity/NaN,更易引发静默错误;推荐用条件判断或封装safePercentage工具方法统一处理零分母策略。
直接在计算前检查分母是否为零,比依赖 arithmeticexception 捕获更安全、更高效——异常应处理意外情况,而非控制流程。
用条件判断提前规避除零
百分比计算通常形如 (part / total) * 100。若 total 可能为 0,应在执行除法前显式校验:
- 若
total == 0,可返回 0、Double.NaN、或自定义占位值(如 -1),取决于业务含义 - 避免把“无意义百分比”当作错误抛出,例如:“0 个用户中完成 0 次操作”的完成率可定义为 0% 或未定义,但不崩溃
- 示例(Java):
double percentage = (total != 0) ? (part * 100.0 / total) : 0.0;
封装为工具方法提升复用与语义清晰度
将校验逻辑提取成静态方法,让调用处更简洁、意图更明确:
- 方法名体现用途,如
safePercentage(double part, double total) - 内部统一处理零分母策略(如返回 0.0、抛出自定义业务异常、或记录警告日志)
- 后续修改策略时只需改一处,避免散落各处的重复 if 判断
慎用 try-catch 处理除零
虽然 ArithmeticException 在整数除零时抛出,但浮点数除零(如 5.0 / 0.0)不会抛异常,而是返回 Infinity 或 NaN,导致结果静默错误:
- 对
int类型:除零确实触发ArithmeticException,但靠捕获它来“兜底”,会让正常逻辑被异常机制打断,性能差且掩盖设计缺陷 - 对
double类型:根本捕不到异常,却可能输出Infinity%这类无效值,更危险 - 除非你明确需要区分“程序逻辑错误”和“数据异常”,否则不推荐用 try-catch 替代前置校验
结合输入验证与默认值设计
从源头减少零分母出现概率:
- 在参数进入计算前做校验(如 Spring 的
@Min(1)注解、DTO 验证) - 数据库中对关键分母字段设
NOT NULL和CHECK(total > 0)约束 - 前端展示时,对 total 为 0 的场景显示“—”或“暂无数据”,而非强行算百分比










