IllegalArgumentException用于参数明显非法时主动抛出,需聚焦API合约禁止值(如null、越界),校验放入口、消息要具体,避免getter中抛出。

Java 中 IllegalArgumentException 主要用于在方法接收到**明显非法、不合逻辑或违反契约的参数值时**主动抛出,提示调用方传参错误。它不是用来兜底所有校验的“万能异常”,关键在于判断:这个参数值是否在当前上下文下**根本不可能合法**(比如传入负数给一个只接受正整数的 ID 生成器)。
明确校验边界:什么该检,什么不该检
校验应聚焦于**API 合约明确禁止的值**,而非业务规则(如“余额不足”属于业务异常,应抛 IllegalStateException 或自定义异常):
- 空值(null):对非可空参数(如方法声明要求非 null)必须检查
- 范围越界:如索引
- 状态矛盾:如传入已关闭的资源句柄、已失效的 token
- 格式硬约束:如正则匹配失败(但仅限 API 明确要求格式,如“必须是 UUID 字符串”)
推荐写法:使用 Objects.requireNonNull + Guava/AssertJ(简洁清晰)
避免手写冗长 if-throw,优先用标准库或成熟工具:
-
JDK 7+ 直接用
Objects.requireNonNull:Objects.requireNonNull(str, "str must not be null"); -
Guava 的
Preconditions(更丰富):Preconditions.checkArgument(age > 0, "age must be positive, got %s", age);Preconditions.checkNotNull(list, "list cannot be null"); -
Spring Framework 的
Assert(适合 Spring 项目):Assert.notNull(name, "name is required");Assert.isTrue(count > 0, "count must be greater than zero");
自定义消息要具体,别只说“参数错误”
错误信息需让调用方一眼看出问题在哪、期望是什么:
立即学习“Java免费学习笔记(深入)”;
- ❌ 差:
throw new IllegalArgumentException("Invalid parameter"); - ✅ 好:
throw new IllegalArgumentException("timeoutMs must be >= 100, but was: " + timeoutMs); - ✅ 更好(带上下文):
throw new IllegalArgumentException("maxRetries for service '" + serviceName + "' must be between 1 and 10, got: " + maxRetries);
注意性能与时机:校验放在入口,避免重复
校验应在方法最开始执行,且只做一次;对高频调用的方法,避免在循环内重复校验同一参数:
- 把校验逻辑放在 public 方法入口,private 辅助方法默认信任参数(由 public 方法已校验过)
- 对集合类操作,校验 size/边界即可,不遍历每个元素——除非契约明确要求每个元素都满足某条件(此时需说明)
- 避免在 getter/setter 中抛
IllegalArgumentException(setter 可抛,getter 一般不应抛)


















