Java如何一次性校验多字段空值并抛出带字段名的NullPointerException
最优实现方案
核心问题解决思路
- 要获取校验不通过的字段名,直接在调用校验方法时将字段名作为入参传入即可,无需反射等复杂操作
- 要实现一次性批量校验,可将所有待校验字段和对应字段名封装为校验集合,遍历完成校验,只要有一项不通过直接抛出异常
- 注意原字符串校验逻辑遗漏了
null判断,null值调用isBlank()会直接触发空指针,需要先补充null校验
改造后的代码实现
import java.util.Date; public class Test { public static void main(String[] args) { String productId = ""; String productName = "Apple"; String productType = "Electronics"; String productRating = "Good"; Date productSellDate = new Date(); Date productReturnDate = new Date(); // 一次性完成所有参数校验 validateAllParams(productId, productName, productType, productRating, productSellDate, productReturnDate); System.out.println("所有参数校验通过"); } /** * 统一校验所有业务参数 */ private static void validateAllParams(String productId, String productName, String productType, String productRating, Date productSellDate, Date productReturnDate) { // 校验字符串类型字段 validateString(productId, "productId"); validateString(productName, "productName"); validateString(productType, "productType"); validateString(productRating, "productRating"); // 校验日期类型字段 validateDate(productSellDate, "productSellDate"); validateDate(productReturnDate, "productReturnDate"); } /** * 校验字符串类型字段:非null、非空、非空白 */ private static void validateString(String s, String fieldName) { if (s == null || s.isBlank()) { throw new NullPointerException(String.format("字段[%s]为空、null或空白", fieldName)); } } /** * 校验日期类型字段:非null */ private static void validateDate(Date d, String fieldName) { if (d == null) { throw new NullPointerException(String.format("字段[%s]为null", fieldName)); } } }
更灵活的批量校验实现(兼容任意字段数量)
如果需要适配不同的校验场景,不需要每次都写单独的校验入口,Java 16+ 可以用Record封装校验项实现通用批量校验:
import java.util.Date; // 字符串校验项封装 record StringValidateItem(String value, String fieldName){} // 日期校验项封装 record DateValidateItem(Date value, String fieldName){} public class Test { public static void main(String[] args) { String productId = ""; String productName = "Apple"; String productType = "Electronics"; String productRating = "Good"; Date productSellDate = new Date(); Date productReturnDate = new Date(); // 批量校验字符串字段 batchValidate( new StringValidateItem(productId, "productId"), new StringValidateItem(productName, "productName"), new StringValidateItem(productType, "productType"), new StringValidateItem(productRating, "productRating") ); // 批量校验日期字段 batchValidate( new DateValidateItem(productSellDate, "productSellDate"), new DateValidateItem(productReturnDate, "productReturnDate") ); System.out.println("所有参数校验通过"); } private static void batchValidate(StringValidateItem... stringItems) { for (StringValidateItem item : stringItems) { validateString(item.value(), item.fieldName()); } } private static void batchValidate(DateValidateItem... dateItems) { for (DateValidateItem item : dateItems) { validateDate(item.value(), item.fieldName()); } } private static void validateString(String s, String fieldName) { if (s == null || s.isBlank()) { throw new NullPointerException(String.format("字段[%s]为空、null或空白", fieldName)); } } private static void validateDate(Date d, String fieldName) { if (d == null) { throw new NullPointerException(String.format("字段[%s]为null", fieldName)); } } }
拓展说明
如果项目中已经引入了常用工具库,可以直接使用成熟的校验工具减少重复代码:
- Spring环境可直接使用
org.springframework.util.Assert工具类,示例:Assert.hasText(productId, "productId不能为空"); - 引入Apache Commons Lang3可使用
org.apache.commons.lang3.Validate工具类,示例:Validate.notBlank(productId, "productId不能为空");
内容的提问来源于stack exchange,提问作者Dave Brady
相关产品推荐
相关产品推荐

