在Java setter中应先校验后赋值,用IllegalArgumentException等运行时异常拦截非法值,确保对象状态不被污染;字符串需先判空再trim,数值校验注意边界,保持setter轻量且风格统一。

在 Java 的 setter 方法中,用 throw 进行属性合法性边界拦截,核心是:**在赋值前做校验,不满足条件就主动抛出异常(通常是 IllegalArgumentException),阻止非法值写入对象状态**。
校验时机必须在赋值之前
setter 的逻辑顺序很关键:先检查、再赋值。如果先赋值再校验,非法值已经污染了对象状态,即使抛异常也无法回滚。
- ✅ 正确写法:校验通过才执行
this.field = value; - ❌ 错误写法:先赋值,再 throw —— 状态已变,违反封装原则
选择合适的异常类型
推荐使用运行时异常(RuntimeException 子类),避免强制调用方处理,符合业务校验语义:
-
IllegalArgumentException:最常用,表示传入参数不合法(如负数年龄、空用户名) -
NullPointerException:当字段不允许为null,且传入null时直接抛出 - 自定义异常(如
InvalidAgeException):适合复杂业务场景,增强可读性和错误分类能力
常见边界校验示例
以一个用户类的 age 和 name 字段为例:
立即学习“Java免费学习笔记(深入)”;
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄必须在 0~150 之间");
}
this.age = age;
}
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("姓名不能为空");
}
if (name.length() > 50) {
throw new IllegalArgumentException("姓名长度不能超过 50 个字符");
}
this.name = name.trim();
}
注意防御性编程细节
校验要覆盖边界情况,同时避免副作用:
- 对字符串校验前先判
null,再调用.trim()或.length(),防止NullPointerException - 数值范围校验注意包含/排除边界(如年龄是否允许 0 岁)
- 避免在 setter 中调用可能改变状态的其他方法(如远程校验、数据库查询),保持 setter 轻量、可预测
不复杂但容易忽略:校验逻辑应与业务规则一致,且所有 setter 都需统一风格——要么都校验,要么明确文档说明“不校验,由调用方保证”。


















