Java方法参数校验应在开头立即抛IllegalArgumentException,只拦截违反基础契约的值(如负数、非法枚举),消息需具体说明参数错误详情,并善用工具类避免重复校验代码。

在 Java 方法设计中,参数校验失败时抛出明确的 IllegalArgumentException,核心是让错误“早暴露、说得清、停得准”。不是等逻辑跑一半才崩,而是在方法刚进门就亮红灯。
校验必须放在方法最开头
所有参数检查语句必须紧贴方法签名之后、任何业务代码之前。一旦发现非法值,立刻中断,不执行任何可能产生副作用的操作(如数据库写、远程调用、状态变更)。
- ✅ 正确:先判断
userId < 0,立即throw;后续代码完全不执行 - ❌ 错误:先查用户信息、更新缓存、记录日志,最后才检查 age 是否为负——此时错误已扩散,回滚成本高,堆栈深,定位难
只拦真正违反基础契约的值
不是所有“看起来不对”的输入都要拦。重点识别那些在当前方法语义下根本不可能合法的值:
- 允许为空的字段(如可选的
remark)不校验null -
userId = null、status = "INVALID"、timeoutMs = -100这类明显越界或非法枚举,必须拦截 - 余额不足、库存超限属于业务规则,应由业务异常(如
InsufficientBalanceException)处理,而非IllegalArgumentException
异常消息要具体、可读、带上下文
消息不是给机器看的,是给开发者和日志系统看的。它应清晰说明:哪个参数、错在哪、期望是什么。
立即学习“Java免费学习笔记(深入)”;
- ✅
throw new IllegalArgumentException("timeoutMs must be positive, got: " + timeoutMs) - ✅
throw new IllegalArgumentException("status must be one of [PENDING, CONFIRMED, CANCELLED], got: " + status) - ❌
throw new IllegalArgumentException("invalid input")—— 模糊,无法直接定位问题
善用工具减少手写重复
避免每个方法都手写 if (x == null) 或 if (s == null || s.trim().isEmpty()),既易漏又难统一。
- 纯
null检查:直接用Objects.requireNonNull(obj, "name must not be null") - 字符串非空:封装
checkNotBlank(str, "email")或用 Apache Commons 的StringUtils.isNotBlank() - 数值范围:统一工具方法如
Validate.positive(age, "age"),确保提示格式一致、逻辑集中


















