You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:36:03