illegalargumentexception 表示参数非法,应提前校验并明确报错;推荐在方法开头用 objects.requirenonnull() 或 if 判断主动抛出带信息的异常,而非捕获吞掉。

遇到 IllegalArgumentException,说明方法收到了明显不合理、无法继续处理的参数值,比如传了 null 给不允许为空的参数,或传了负数给要求正整数的 ID。这不是系统故障,而是调用方用错了——处理它的核心思路是:**提前检查、明确报错、引导修复,而不是捕获后吞掉或硬扛**。
主动校验参数,把问题挡在入口
最推荐的做法是在方法开头就做参数合法性检查,并立即抛出带具体信息的 IllegalArgumentException。这样调用方能第一时间知道错在哪,也避免后续逻辑出更隐蔽的问题。
- 用
Objects.requireNonNull()检查必填对象是否为null - 对数值类参数(如索引、数量、ID)直接用
if (x 或 <code>if (x == 0)判断范围 - 字符串常用
str == null || str.trim().isEmpty()判断空值或空白 - 异常消息尽量具体,例如:
"timeoutMs must be positive, but got: " + timeoutMs
别盲目 try-catch 吞掉这个异常
IllegalArgumentException 是 unchecked 异常,编译器不强制你捕获。但反过来,也不建议在业务逻辑里用 try...catch 去“兜底”它。
- 捕获后若只是打印日志然后忽略,等于掩盖了调用错误,下次还会出问题
- 如果 catch 后返回默认值(如
return null或return 0),可能让上游误以为操作成功,引发更难排查的逻辑错误 - 真需要容错,应由上层调用方负责校验,而不是在被调用方法里降级处理
配合注解和文档,从源头减少误用
光靠运行时报错还不够,要让开发者在写代码时就意识到约束:
- 在参数上加
@NonNull(如 JetBrains 或 Lombok 提供)、@NotNull(JSR-303)等注解,配合 IDE 实时提示 - Javadoc 明确写清每个参数的取值范围和含义,例如:
@param id 非负整数,表示用户唯一标识 - 单元测试覆盖非法输入场景,验证是否按预期抛出
IllegalArgumentException
工具类可封装通用校验逻辑
重复的参数检查容易写错或遗漏,可抽成静态工具方法复用:
Check.argNotNull(obj, "obj")Check.argPositive(num, "count")Check.argInRange(value, min, max, "score")
Apache Commons Lang 的 Validate 类或 Google Guava 的 Preconditions 已提供成熟实现,可直接引入使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











