“尽早报错”要求在Java方法入口处立即校验参数合法性并抛出IllegalArgumentException。使用Objects.requireNonNull、Validate工具类或手动判断,配合注解与值对象提升可维护性,确保错误信息具体、异常类型统一。

在 Java 方法设计中,“尽早报错”意味着在方法最开始就验证参数合法性,一旦发现非法输入立即抛出异常(如 IllegalArgumentException),而不是等到后续逻辑执行到某处才暴露问题。这能显著提升调试效率、明确错误源头,并避免无效计算或状态污染。
入口处做参数校验
把校验逻辑放在方法第一行,紧随访问修饰符和签名之后。使用标准 JDK 工具类或手动判断:
- 对引用类型用
Objects.requireNonNull(obj, "msg")检查 null - 对数值范围用类似
if (id - 对字符串非空用
if (str == null || str.trim().isEmpty()) - JDK 9+ 可考虑
Objects.checkIndex、checkFromToIndex等增强方法
优先使用不可变、明确语义的校验方式
避免把校验逻辑藏在业务分支里,也不要依赖下游方法间接报错。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 不要在调用
list.get(index)前不检查index范围,指望它抛IndexOutOfBoundsException - ✅ 显式写
if (index = list.size()) throw new IllegalArgumentException(...) - 校验信息尽量具体,比如指出是哪个参数、什么规则不满足,方便调用方快速修复
配合注解与工具提升可维护性
单纯手写校验易遗漏或冗余,可结合以下方式:
立即学习“Java免费学习笔记(深入)”;
- 使用
@NonNull、@NotNull(如 JetBrains 或 Checker Framework)配合静态分析,在编译期提示潜在问题 - 引入
org.apache.commons.lang3.Validate简化常见断言,如Validate.notBlank(name, "name cannot be blank") - 对于复杂对象参数,可封装为值对象(Value Object),在构造时完成全部校验,保证实例一旦创建即合法
注意异常类型的选择与一致性
非法参数应抛 IllegalArgumentException(运行时异常),而非检查型异常:
- 它是 unchecked 异常,调用方无需强制捕获,符合“参数错误属于编程错误”的定位
- 避免混用
IllegalStateException(表示对象状态非法)或NullPointerException(应由requireNonNull主动抛,而非任由 NPE 冒泡) - 团队内统一错误消息格式,例如:"
%s must not be null" 或 "%s must be between %d and %d"

















