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

如何在Java中减少重复错误处理?多类型对象场景实现方案

封装空值校验逻辑的实现方案

针对你代码里重复的空值校验+日志+抛异常逻辑,可以利用Java的泛型和函数式接口实现通用封装,不用因对象类型不同写重复方法。

1. 定义通用工具方法

创建工具类ValidationUtils,把核心校验逻辑封装进去:

import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.function.Supplier;

public class ValidationUtils {
    private static final Logger log = LoggerFactory.getLogger(ValidationUtils.class);

    /**
     * 校验对象非空,为空则打日志并抛出指定异常
     * @param target 要校验的目标对象
     * @param errorMsgSupplier 动态生成错误日志的提供者(支持拼接上下文信息)
     * @param exceptionSupplier 要抛出的异常提供者
     * @param <T> 目标对象的类型
     * @return 非空的目标对象
     */
    public static <T> T requireNonNull(T target, Supplier<String> errorMsgSupplier, Supplier<? extends RuntimeException> exceptionSupplier) {
        if (ObjectUtils.isEmpty(target)) {
            String errorMsg = errorMsgSupplier.get();
            log.error(errorMsg);
            throw exceptionSupplier.get();
        }
        return target;
    }

    // 重载方法:针对常用的固定异常场景,简化调用
    public static <T> T requireNonNull(T target, Supplier<String> errorMsgSupplier) {
        return requireNonNull(target, errorMsgSupplier, () -> new RuntimeException("xyz"));
    }
}

2. 在业务代码中调用

不管是teachers还是students,甚至其他类型对象,都用同一个方法校验:

// 校验教师列表非空
List<Teacher> teachers = ValidationUtils.requireNonNull(
        school.getTeachers(),
        () -> "cannot find teachers in school " + school.getSchoolName()
);

// 校验学生列表非空
List<Student> students = ValidationUtils.requireNonNull(
        teachers.getStudents(),
        () -> "cannot find students in school " + school.getSchoolName()
);

方案优势

  • 泛型<T>支持任意类型对象,无需为每种类型单独写校验方法
  • 函数式Supplier允许动态生成错误信息和异常,灵活适配不同上下文
  • 核心逻辑只维护一次,后续修改只需调整工具类,符合代码复用原则

内容的提问来源于stack exchange,提问作者bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:25:05