IllegalArgumentException专用于校验方法签名隐含的硬性约束,如负数、空字符串、非法枚举值、空集合;禁用于外部状态或业务规则;须入口即校验,消息需明确参数名、实际值、规则及期望值。

Java中IllegalArgumentException(简称IAE)不是“随便抛的错”,而是公开API契约的守门人——它专用于在方法入口就拦截那些**明显违反逻辑前提的参数值**,比如负数年龄、空用户ID、非法状态码。用对了,调用方一眼看懂错在哪;用错了,反而掩盖真实问题。
哪些参数该用IAE校验
只对「方法签名隐含的硬性约束」校验,不处理外部状态或业务规则:
- 数值越界:如
timeoutMs < 0、retryCount < 1 - 字符串非空:要求
userId不能为null或空白(trim().isEmpty()) - 枚举合法性:
status必须是PENDING/COMPLETED之一 - 容器非空:当接口明确要求
List<Item>不能为空时,拒绝null或空集合
⚠️ 别用IAE处理:数据库查不到记录、远程服务超时、文件路径不存在——这些属于运行时异常,该用IllegalStateException、IOException或自定义业务异常。
校验必须放在方法最开头
入口即校验,不拖延、不隐藏、不混入业务逻辑。错误示例是先做日志、再查缓存、最后才检查参数——堆栈难定位,调试成本高。
立即学习“Java免费学习笔记(深入)”;
✅ 推荐写法(清晰、可读、易维护):
public void createOrder(String orderId, int quantity, String paymentMethod) {if (orderId == null || orderId.trim().isEmpty()) {
throw new IllegalArgumentException("orderId must not be null or blank");
}
if (quantity < 1) {
throw new IllegalArgumentException("quantity must be at least 1, got: " + quantity);
}
if (!List.of("ALIPAY", "WECHAT", "CARD").contains(paymentMethod)) {
throw new IllegalArgumentException("paymentMethod must be one of [ALIPAY, WECHAT, CARD], got: " + paymentMethod);
}
// ✅ 此时才执行创建订单核心逻辑
doCreate(orderId, quantity, paymentMethod);
}
异常消息要像给同事写提示
别写“invalid parameter”,要写清:哪个参数、实际值多少、违反哪条规则、期望是什么。
- ❌
new IllegalArgumentException("Invalid input") - ✅
new IllegalArgumentException("maxRetries must be positive, but was: " + maxRetries) - ✅
new IllegalArgumentException("status 'DRAFT' is not supported; allowed: PENDING, COMPLETED")
注意:避免把密码、token、手机号等敏感字段直接拼进消息,防止日志泄露;数值建议用String.format或显式Integer.toString转换,避免隐式toString()触发意外行为。
善用工具类减少样板代码
不用每行都手写if (x == null):
-
Objects.requireNonNull(obj, "obj must not be null")→ 抛NullPointerException,语义更准、JVM有优化(但注意:它不是IAE) - Apache Commons Lang:
StringUtils.isNotBlank(str)判断非空字符串 - Guava:
Preconditions.checkArgument(quantity > 0, "quantity must be > 0, got %s", quantity) - Spring Boot Controller层可用
@Valid+@Min(1)、@NotBlank,失败自动转为MethodArgumentNotValidException(底层仍是IAE风格逻辑)
不复杂但容易忽略


















