基本类型无法直接校验,必须用包装类配合约束注解、显式解析校验和运行时类型检查来主动设防:参数用Integer+@Min/@Max、parseXxx()配try-catch与二次校验、集合用Collections.checkedList、区分null与0表达空状态。

基本类型本身无法校验,必须用包装类配合显式检查才能防非法输入。关键不是等异常发生,而是在数据入口、转换、运算各环节主动设防。
参数校验:用包装类 + 约束注解拦截非法字符串
原始类型(如 int)不能被 @Min/@Max 等 JSR-303 注解识别,必须改用包装类(如 Integer):
- 定义接口参数时写
Integer age,而非int age - 加上
@Min(1) @Max(150),并在控制器启用校验(如 Spring 中加@Valid) - null 值会被自动捕获为校验失败,无需额外判空
字符串转数值:parseXxx() 必须配 try-catch 和范围再校验
JDK 的 parseXxx() 方法只负责格式解析,不保证语义合法。例如 Integer.parseInt("2147483648") 会抛 NumberFormatException,但 "1000" 虽然能转成功,仍可能超出业务逻辑允许范围。
- 先 trim 并判空,避免空白字符串触发异常
- 用
try-catch捕获NumberFormatException,统一返回参数错误提示 - 对成功解析的值,再按业务规则二次校验(如年龄不能为负、ID 不能小于 0)
- 整数运算中涉及加减乘,建议用
Math.addExact()等方法,溢出时直接抛ArithmeticException
集合与容器:用 checkedCollection 防止运行时类型错乱
泛型在运行时被擦除,List<string></string> 仍可能被强转后塞进 Integer。这时靠 Collections.checkedList(new ArrayList(), String.class) 在每次 add 时做 instanceof 检查:
立即学习“Java免费学习笔记(深入)”;
- 只校验新增/修改操作,不扫描已有元素,所以初始化后立即包装
- 类型匹配是精确的——
Number.class允许Integer,但String.class不接受任何子类(String 是 final) - 若需对外暴露集合引用(如 DAO 返回值),应只返回 checked 包装后的视图,不暴露底层原始集合引用
默认值与空状态:区分 0、null 和非法缺失
基本类型有默认值(如 int 默认是 0),但 0 可能是有效值,也可能是未赋值的“假合法”。包装类天然支持 null,可明确表达“未提供”:
- 数据库字段允许为空时,对应 Java 字段必须用
Integer、Boolean等,不能用int、boolean - JSON 反序列化时,Jackson 默认将缺失字段设为
null(包装类)或默认值(基本类型),要根据语义决定是否允许缺失 - 校验逻辑中,优先检查
== null,再检查业务范围,避免把“没传”误认为“传了 0”


















