不该。java的assert默认关闭,生产环境无效,而illegalargumentexception是强制、可捕获的运行时校验,应置于方法入口处拦截非法输入,配合objects.requirenonnull、validate等工具精准校验核心约束,且校验须紧贴方法签名。

Java里抛IllegalArgumentException该不该用assert?
不该。Java的assert默认是关闭的,生产环境完全不生效,而IllegalArgumentException是明确的、不可绕过的运行时校验——它该出现在方法入口,用来拦截非法输入,不是用来“调试时看看”。
- 开发阶段开
-ea参数才能让assert起作用,但上线几乎从不加,等于白写 -
IllegalArgumentException被JVM强制检查,调用栈清晰,Spring、Jackson等框架也认这个异常,能自然融入统一错误处理 - 别在private方法里偷懒用
assert,只要参数可能来自外部(哪怕只是另一个public方法),就该用throw new IllegalArgumentException(...)
怎么写才不算啰嗦又覆盖常见非法值?
核心是:只校验真正影响逻辑的约束,不校验“看起来不对”的模糊条件。比如String判空比判“是否全是emoji”更合理;int校验范围比校验“是否为质数”更合理。
- 字符串:优先用
Objects.requireNonNull(str, "str must not be null")和!str.trim().isEmpty(),别直接str == null || str.length() == 0(忽略空白) - 数值:用
if (id ,别写<code>if (id (语义弱,且容易漏=0) - 集合:用
CollectionUtils.isNotEmpty(list)(Apache Commons)或list != null && !list.isEmpty(),避免NPE+空指针双重风险
Spring Boot里怎么统一处理这类异常?
别在每个Controller里都try-catch IllegalArgumentException。用@ControllerAdvice配合@ExceptionHandler(IllegalArgumentException.class)做全局拦截,返回400而不是500。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
- 注意:Spring MVC默认把
IllegalArgumentException当客户端错误(400),但如果你手动throw new IllegalArgumentException("xxx")在Service层,没被Controller捕获,就会变成500——因为默认异常处理器只管Controller层抛出的异常 - 推荐在Service方法上加
@Valid注解 + DTO,让校验提前到绑定阶段,这样IllegalArgumentException就只留作兜底(比如校验数据库唯一性失败后手动抛) - 日志里务必记录原始参数值,例如
log.warn("Invalid user id: {}", userId),否则排查时只能靠猜
Guava/AssertJ能不能替代手写if-throw?
可以,但要注意依赖引入成本和团队习惯。Guava的Preconditions最常用,AssertJ更适合测试,生产代码里慎用后者。
立即学习“Java免费学习笔记(深入)”;
- Guava:
Preconditions.checkArgument(id > 0, "id must be positive, got %s", id),支持占位符、开销小、语义明确 - Apache Commons Lang:
Validate.notNull(obj, "obj must not be null"),对null校验友好,但对数值范围支持弱 - 别用AssertJ的
assertThat(x).isPositive()在业务代码里——它是为测试设计的,抛的是AssertionError,不是IllegalArgumentException,不符合语义也不利于统一异常处理









