不用层层判空,这个Java参数断言工具类有13个方法

简介: 这是一套轻量级Java断言工具类,提供13个高内聚校验方法(如`notNull`、`notBlank`、`inRange`等),支持对象、字符串、集合、Map、数组、布尔表达式及数值范围校验,全部方法校验通过即原值返回,便于链式调用;要求JDK 17+,开箱即用。

📋 目录

一、工具类功能

方法入口处一行断言替掉层层判空:对象非 null、字符串非空白、集合与 Map 与数组非空、布尔成立、数值在闭区间、长度在范围内;校验通过就把值原样返回,能直接写进赋值和链式调用。

二、所需环境

JDK 17或以上

三、方法与调用示例(按需调用)

🔢 方法序号:1

🎯 方法用途:

  • 断言对象不为 null,通过时把原对象返回,可以直接写进赋值语句
  • 构造器注入、字段赋值这类「进来就得有值」的入口用它替掉一层判空

🧩 方法定义:public static <T> T notNull(T object, String message)

🗣️ 入参解释:public static <T> T notNull(待校验对象, 自定义消息)

📤 返回值解释:T,就是传进来的那个对象,不做拷贝

💡 边界口径:

  • 失败抛 IllegalArgumentException,消息完全用调用方传入的文案
  • 返回的是同一个引用,不是新建对象
  • 只判 null,空串与纯空白要用 notEmpty、notBlank
  • 想省掉消息用单参版,消息走默认文案

🧪 方法示例:

  • notNull(" tom ", "buyer 不能为null").length() 拿到 7,值被直接接走
  • 断言通过时返回的就是原对象,notNull("abc", "不该抛") 拿到 true
  • 传 null 抛 IllegalArgumentException,消息是自定义的那句

🔢 方法序号:2

🎯 方法用途:

  • 判 null 的简写版,不传消息,失败时用固定文案
  • 内部代码、消息不需要给前端看的场合用它少敲一个参数

🧩 方法定义:public static <T> T notNull(T object)

🗣️ 入参解释:public static <T> T notNull(待校验对象)

📤 返回值解释:T,传进来的对象本身

💡 边界口径:

  • 默认消息是 参数不能为null,不带参数名,对外提示不如两参版清楚
  • 口径与两参版完全一致,内部就是转调

🧪 方法示例:

  • notNull("order-service") 拿到 order-service
  • notNull(null) 抛 参数不能为null

🔢 方法序号:3

🎯 方法用途:

  • 拦 null 与全空白字符串,原值返回且不做 trim
  • 用户名、备注这类「不能是空白但内容原样保留」的入参校验

🧩 方法定义:public static String notBlank(String str, String message)

🗣️ 入参解释:public static String notBlank(字符串, 自定义消息)

📤 返回值解释:String,校验通过的原字符串,前后空白不会被去掉

💡 边界口径:

  • 判的是「null 或全空白」,空格、制表符、全角空格都算空白
  • 返回原值不 trim,需要干净值自己再调 trim
  • 与 notEmpty(String, String) 的差别就在纯空白能不能过
  • 失败抛 IllegalArgumentException,消息用传入文案

🧪 方法示例:

  • notBlank(" tom ", "买家名不能为空白") 拿到 [ tom ],两侧空格原样留着
  • notBlank(" ", "买家名不能为空白") 抛 买家名不能为空白

🔢 方法序号:4

🎯 方法用途:

  • 只拦 null 与空串的字符串断言,纯空白串视为有内容
  • 允许填空格、但不允许完全不填的字段用它,别误用 notBlank
  • 集合、Map、数组的非空断言是同名重载,口径见方法5 到方法7

🧩 方法定义:public static String notEmpty(String str, String message)

🗣️ 入参解释:public static String notEmpty(字符串, 自定义消息)

📤 返回值解释:String,原字符串

💡 边界口径:

  • 判的是 null 或长度为 0," " 这种一个空格的串能过
  • 与字符串入参的集合、Map、数组重载共用一个名字,传 null 字面量时要显式转型,例如 notEmpty((String) value, "msg")
  • 失败抛 IllegalArgumentException

🧪 方法示例:

  • notEmpty(" ", "不能为空串") 拿到 [ ],纯空白串过了
  • notEmpty((String) null, "备注不能为空") 抛 备注不能为空

🔢 方法序号:5

🎯 方法用途:

  • 断言集合非 null 且至少有一个元素,通过时返回同一个集合
  • 购物车、明细列表这类「不能空着提交」的入参用它挡在门口

🧩 方法定义:public static <C extends Collection<?>> C notEmpty(C collection, String message)

🗣️ 入参解释:public static <C extends Collection<?>> C notEmpty(集合, 自定义消息)

📤 返回值解释:C,原集合,保留具体类型

💡 边界口径:

  • 只看 isEmpty(),元素本身可以是 null
  • 返回的是同一个实例,后续改动会互相看见
  • null 与空集合都按失败处理,抛 IllegalArgumentException

🧪 方法示例:

  • notEmpty(items, "购物车不能空") 拿到 2 个元素,且返回的就是那个原集合
  • notEmpty(new ArrayList<String>(), "购物车不能空") 抛 购物车不能空
  • notEmpty((List<String>) null, "列表不能为空") 抛 列表不能为空

🔢 方法序号:6

🎯 方法用途:

  • 断言 Map 非 null 且至少有一个条目,返回原 Map
  • 配置表、价格表这类不能空着传进来的字典参数用这一版

🧩 方法定义:public static <M extends Map<?, ?>> M notEmpty(M map, String message)

🗣️ 入参解释:public static <M extends Map<?, ?>> M notEmpty(Map, 自定义消息)

📤 返回值解释:M,原 Map,保留具体类型

💡 边界口径:

  • 判的是 isEmpty(),值为 null 的条目算有条目
  • null 与空 Map 都抛 IllegalArgumentException
  • 与集合、数组重载同名,传 null 字面量要转型

🧪 方法示例:

  • notEmpty(prices, "价格表不能为空") 拿到 {手机=4999}
  • notEmpty(new HashMap<String, String>(), "配置不能为空") 抛 配置不能为空

🔢 方法序号:7

🎯 方法用途:

  • 断言对象数组非 null 且长度大于 0,返回原数组
  • 变参、批量券码这类以数组形态进来的参数用这一版

🧩 方法定义:public static <T> T[] notEmpty(T[] array, String message)

🗣️ 入参解释:public static <T> T[] notEmpty(对象数组, 自定义消息)

📤 返回值解释:T[],原数组

💡 边界口径:

  • 只收对象数组,int[] 等基本类型数组不是 Object[] 的子类型,编不过
  • 基本类型数组要判空就直接写 array.length == 0,或先包成集合
  • null 与长度 0 都抛 IllegalArgumentException

🧪 方法示例:

  • notEmpty(coupons, "优惠券数组不能为空").length 拿到 1 张券
  • notEmpty(new String[0], "券码不能为空") 抛 券码不能为空

🔢 方法序号:8

🎯 方法用途:

  • 断言布尔表达式为真,为假就抛出,返回 void
  • 库存够不够、状态能不能改这类业务前置条件用它是现成的

🧩 方法定义:public static void isTrue(boolean expression, String message)

🗣️ 入参解释:public static void isTrue(布尔表达式, 自定义消息)

📤 返回值解释:void,本类里唯二不返回值的方法之一,通过就无声返回

💡 边界口径:

  • 消息由调用方给,工具类不猜业务语义
  • 条件为真时不做任何事,没有返回值可以链式用
  • 抛的是 IllegalArgumentException,不是自定义业务异常,需要特定异常类型就自己 if 抛

🧪 方法示例:

  • isTrue(stock > 0, "库存不足,无法下单") 无声通过,日志里还是 库存 8
  • isTrue(stock == 0, "库存不足,无法下单") 抛 库存不足,无法下单

🔢 方法序号:9

🎯 方法用途:

  • 断言布尔表达式为假,为真就抛出,返回 void
  • 「不能重复提交」「必须未支付」这类否定条件用它,省去取反

🧩 方法定义:public static void isFalse(boolean expression, String message)

🗣️ 入参解释:public static void isFalse(布尔表达式, 自定义消息)

📤 返回值解释:void,表达式为假时无声返回

💡 边界口径:

  • 与 isTrue 互为镜像,不做其他校验
  • 抛出的仍是 IllegalArgumentException

🧪 方法示例:

  • isFalse(false, "该订单已取消,不能重复提交") 通过,日志里是 已取消标记 false
  • isFalse(true, "已取消的订单不能重复取消") 抛 已取消的订单不能重复取消

🔢 方法序号:10

🎯 方法用途:

  • 断言整数值落在闭区间 [min, max] 内,返回原值
  • 年龄、分页页码、数量上限这类有明确边界的整数参数用它,消息自带上下限与实际值

🧩 方法定义:public static long inRange(long value, long min, long max, String name)

🗣️ 入参解释:public static long inRange(数值, 下限, 上限, 参数名)

📤 返回值解释:long,校验通过的原始数值

💡 边界口径:

  • 上下限都算在区间内,边界值能通过
  • 越界消息形如 age必须在[0, 150]之间,当前为-1,参数名由调用方给
  • 下限大于上限属配置错误,当场抛异常,消息里的数字按小数打印
  • 消息只拼值,不做本地化数字格式

🧪 方法示例:

  • inRange(30L, 0L, 150L, "age") 拿到 30
  • 正好压上限 inRange(150L, 0L, 150L, "age") 拿到 150
  • inRange(-1L, 0L, 150L, "age") 抛 age必须在[0, 150]之间,当前为-1
  • 区间写反 inRange(5L, 10L, 1L, "age") 抛 区间下限不能大于上限: min=10.0, max=1.0

🔢 方法序号:11

🎯 方法用途:

  • 断言浮点值落在闭区间内,NaN 值与 NaN 边界都单独拦下
  • 折扣率、比例这类 0 到 1 的小数校验用这一版

🧩 方法定义:public static double inRange(double value, double min, double max, String name)

🗣️ 入参解释:public static double inRange(数值, 下限, 上限, 参数名)

📤 返回值解释:double,校验通过的原始数值

💡 边界口径:

  • 值是 NaN 直接抛 参数名不能为NaN,不会跟区间比出个假通过
  • 边界写 NaN 也算配置错误,当场抛异常
  • ±Infinity 作边界是允许的,表示这一头不封顶
  • 上下限含在内,口径与整型版一致

🧪 方法示例:

  • inRange(0.85D, 0D, 1D, "discount") 拿到 0.85
  • 上界给正无穷 inRange(1.0D, 0D, Double.POSITIVE_INFINITY, "amount") 拿到 1.0
  • 下界给负无穷 inRange(-1D, Double.NEGATIVE_INFINITY, 1D, "rate") 拿到 -1.0
  • 值是 NaN 抛 rate不能为NaN
  • 边界是 NaN 抛 区间边界不能为NaN: min=NaN, max=1.0

🔢 方法序号:12

🎯 方法用途:

  • 断言数值严格大于下界,等于下界不算通过,返回原值
  • 用户 ID 必须为正、数量必须大于 0 这类只有下限的场景

🧩 方法定义:public static long greaterThan(long value, long min, String name)

🗣️ 入参解释:public static long greaterThan(数值, 下界, 参数名)

📤 返回值解释:long,校验通过的原始数值

💡 边界口径:

  • 比较是严格大于,value == min 判失败
  • 没有上限概念,要双向限制用 inRange
  • 消息形如 qty必须大于1000,当前为1000

🧪 方法示例:

  • greaterThan(1001L, 0L, "userId") 拿到 1001
  • greaterThan(1000L, 1000L, "qty") 抛 qty必须大于1000,当前为1000

🔢 方法序号:13

🎯 方法用途:

  • 断言字符串长度落在 [min, max] 内,返回原串
  • 昵称、备注这类限长字段用它,消息自带区间与实际长度

🧩 方法定义:public static String lengthBetween(String str, int min, int max, String name)

🗣️ 入参解释:public static String lengthBetween(字符串, 最小长度, 最大长度, 参数名)

📤 返回值解释:String,校验通过的原字符串

💡 边界口径:

  • 长度按 char 计数,Emoji 这类增补字符占 2 个 char
  • 区间写反属配置错误,抛 长度区间非法: min=3, max=1,不会留下永远不通过的校验
  • 上下限含在内,长度等于边界算通过
  • 字符串为 null 按失败处理,抛 IllegalArgumentException

🧪 方法示例:

  • lengthBetween("小明", 2, 12, "nick") 拿到 小明
  • lengthBetween(emojiNick, 2, 12, "nick") 拿到 [😀笑] 的长度是 3,Emoji 按 2 个 char 计
  • lengthBetween("abcd", 1, 3, "nick") 抛 nick长度必须在[1, 3]之间,当前为4
  • 区间写反抛 长度区间非法: min=3, max=1

四、工具类源码(可直接复制)

📦 源码文件

相关文章
|
4天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
|
云安全 安全 网络安全
|
18天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
4221 2
|
17天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2792 49
|
10天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2078 2
|
9天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。
|
14天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1543 3
|
11天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
2182 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用