SpringBoot内置工具类之断言Assert的使用与部分解析

先例举一个service的demo中用来验证参数对象的封装方法,使用了Assert工具类后是不是比普通的 if(xxx) { throw new RuntimeException(msg) } 看上去要简洁多了?
在这里插入图片描述

断言Assert工具类简介

  1. 断言是一个判断逻辑,用来检查不该发生的情况;
  2. 断言的判定规则:
    2.1.值为true时,程序从断言语句处继续执行;
    2.2.值为false时,程序从断言语句处抛出异常,停止执行;
    2.3.早在JDK的1.4版本已经引入断言assert,通过命令-enableassertions开启,通过命令-disableassertions关闭;不加参数,全局生效;加了参数,只在某个类中使用;具体可通过java help命令查看;
  3. Springframework框架中也提供了断言工具类Assert,通常用于数据合法性验证。我们今天说的就是它。

断言Assert工具类的使用

public static void main(String[] argo){Object obj = null;Assert.isNull(obj, "对象必须为NULL,否则抛异常不予放行");Assert.notNull(new Object(), "对象不能为NULL,否则抛异常不予放行");Assert.state(true, "参数必须为true,否则抛异常不予放行");Assert.isTrue(true, "参数必须为true,否则抛异常不予放行");// null 或 空字符串 断言失败,空格断言成功Assert.hasLength(" ", "参数必须有长度,否则抛异常不予放行");// null、空字符串、纯空格断言失败Assert.hasText("  dd", "参数必须有正文,否则抛异常不予放行");Assert.doesNotContain("text", "bb", "第一个参数不能包含第二个参数,否则抛异常不予放行");Object[] objArray = {true, false,};// 除了对象数组,还有其他类型的数组,在此不在一一举例Assert.notEmpty(objArray, "对象数组不能为空,否则抛异常不予放行");Assert.noNullElements(objArray, "对象数组中不能有null元素,否则抛异常不予放行");Map<String,String> map = new HashMap<String,String>();Assert.isInstanceOf(Map.class, map, "第二个参数必须是第一个参数的实例,否则抛异常不予放行");Assert.isAssignable(Map.class, List.class, "第二个参数必须是第一个参数的子类或者实现类,否则抛异常不予放行");    System.out.println("全部断言成功~!");}

把最后一个断言设置失败时,失败的语句处抛出异常,程序在此处终止运行,运行结果如下所示:

Exception in thread "main" java.lang.IllegalArgumentException: 第二个参数必须是第一个参数的子类或者实现类,否则抛异常不予放行: interface java.util.Listat org.springframework.util.Assert.assignableCheckFailed(Assert.java:720)at org.springframework.util.Assert.isAssignable(Assert.java:651)at com.example.util.SpringUtilTest.main(SpringUtilTest.java:40)

断言Assert工具类的部分源码

import java.util.Collection;
import java.util.Map;
import java.util.function.Supplier;import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;/*** 断言工具类类* SpringBoot 2.1.4.RELEASE* 符合条件就继续执行,否则抛异常不予放行*/
public abstract class Assert {/*** 参数expression必须为true,否则抛异常,不予放行* @param expression boolean型表达式* @param message 用于定制异常消息内容*/public static void state(boolean expression, String message) {if (!expression) {throw new IllegalStateException(message);}}/*** 参数expression必须为true,否则抛异常,不予放行* @param expression* @param message*/public static void isTrue(boolean expression, String message) {if (!expression) {throw new IllegalArgumentException(message);}}/*** 要求对象object必须为null,否则抛异常,不予放行* @param object* @param message*/public static void isNull(@Nullable Object object, String message) {if (object != null) {throw new IllegalArgumentException(message);}}/*** 要求参数object不为null,否则抛异常,不予放行;* 和isNull() 方法相反* @param object* @param message*/public static void notNull(@Nullable Object object, String message) {if (object == null) {throw new IllegalArgumentException(message);}}/*** 要求参数text必须有长度,不为null且长度大于0,否则抛异常,不予放行* @param text 字符串文本* @param message*/public static void hasLength(@Nullable String text, String message) {if (!StringUtils.hasLength(text)) {throw new IllegalArgumentException(message);}}/*** 要求参数text必须有内容,否则抛异常,不予放行* @param text 字符串文本* @param message*/public static void hasText(@Nullable String text, String message) {if (!StringUtils.hasText(text)) {throw new IllegalArgumentException(message);}}/*** 要求textToSearch不包含substring,否则抛异常,不予放行* @param textToSearch 要检索的字符串文本* @param substring 被检索字符* @param message*/public static void doesNotContain(@Nullable String textToSearch, String substring, String message) {if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) &&textToSearch.contains(substring)) {throw new IllegalArgumentException(message);}}/*** 要求参数array不为null,否则抛异常,不予放行* @param array 对象数组* @param message*/public static void notEmpty(@Nullable Object[] array, String message) {if (ObjectUtils.isEmpty(array)) {throw new IllegalArgumentException(message);}}/*** 要求对象数组array中没有Null元素,否则抛异常,不予放行* @param array* @param message*/public static void noNullElements(@Nullable Object[] array, String message) {if (array != null) {for (Object element : array) {if (element == null) {throw new IllegalArgumentException(message);}}}}/*** 要求集合collection不为null、不为空集合,否则抛异常,不予放行* @param collection* @param message*/public static void notEmpty(@Nullable Collection<?> collection, String message) {if (CollectionUtils.isEmpty(collection)) {throw new IllegalArgumentException(message);}}/*** 要求Map集合不为null,不为空集合,否则抛异常,不予放行* @param map the map to check* @param message the exception message to use if the assertion fails* @throws IllegalArgumentException if the map is {@code null} or contains no entries*/public static void notEmpty(@Nullable Map<?, ?> map, String message) {if (CollectionUtils.isEmpty(map)) {throw new IllegalArgumentException(message);}}/*** 要求对象obj必须是指定类type的实例,否则抛异常,不予放行* @param type* @param obj* @param message*/public static void isInstanceOf(Class<?> type, @Nullable Object obj, String message) {notNull(type, "Type to check against must not be null");if (!type.isInstance(obj)) {instanceCheckFailed(type, obj, message);}}/*** 要求对象obj必须是指定类type的实例,否则抛异常,不予放行* @param type * @param obj* @param message*/public static void isInstanceOf(Class<?> type, @Nullable Object obj) {isInstanceOf(type, obj, "");}/*** 要求参数subType必须是参数superType的子类或者实现类,否则抛出异常,不予放行* @param superType* @param subType* @param message*/public static void isAssignable(Class<?> superType, @Nullable Class<?> subType, String message) {notNull(superType, "Super type to check against must not be null");if (subType == null || !superType.isAssignableFrom(subType)) {assignableCheckFailed(superType, subType, message);}}/*** 要求参数subType必须是参数superType的子类或者实现类,否则抛出异常,不予放行* @param superType* @param subType* @param message*/public static void isAssignable(Class<?> superType, Class<?> subType) {isAssignable(superType, subType, "");}private static void instanceCheckFailed(Class<?> type, @Nullable Object obj, @Nullable String msg) {String className = (obj != null ? obj.getClass().getName() : "null");String result = "";boolean defaultMessage = true;if (StringUtils.hasLength(msg)) {if (endsWithSeparator(msg)) {result = msg + " ";}else {result = messageWithTypeName(msg, className);defaultMessage = false;}}if (defaultMessage) {result = result + ("Object of class [" + className + "] must be an instance of " + type);}throw new IllegalArgumentException(result);}private static void assignableCheckFailed(Class<?> superType, @Nullable Class<?> subType, @Nullable String msg) {String result = "";boolean defaultMessage = true;if (StringUtils.hasLength(msg)) {if (endsWithSeparator(msg)) {result = msg + " ";}else {result = messageWithTypeName(msg, subType);defaultMessage = false;}}if (defaultMessage) {result = result + (subType + " is not assignable to " + superType);}throw new IllegalArgumentException(result);}private static boolean endsWithSeparator(String msg) {return (msg.endsWith(":") || msg.endsWith(";") || msg.endsWith(",") || msg.endsWith("."));}private static String messageWithTypeName(String msg, @Nullable Object typeName) {return msg + (msg.endsWith(" ") ? "" : ": ") + typeName;}@Nullableprivate static String nullSafeGet(@Nullable Supplier<String> messageSupplier) {return (messageSupplier != null ? messageSupplier.get() : null);}
}

简单来说就是验证失败就抛出异常,终止代码的执行。


总结

Assert工具类中大约有30多个静态方法供外部类调用,它的特点就是符合条件继续执行,否则抛出IllegalArgumentException异常。这个工具类是Spring框架util包(org.springframework.util)中的工具类

参考:SpringBoot内置工具类之 断言 Assert

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/172898.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…

【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘

1. 错误提示 在python程序中试图导入一个名为cPickle的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named cPickle 2. 解决方案 实际上&#xff0c;cPickle是Python的pickle模块的一个C语言实现&#xff0c;通常用于…

MySQL实战2

文章目录 主要内容一.回访用户1.准备工作代码如下&#xff08;示例&#xff09;: 2.目标3.实现代码如下&#xff08;示例&#xff09;: 二.如何找到每个人每月消费的最大天数1.准备工作代码如下&#xff08;示例&#xff09;: 2.目标3.实现代码如下&#xff08;示例&#xff09…

Windows查看核心与线程数

文章目录 前言一、可视化界面1、任务管理器2、设备管理器3、CPU-Z 二、命令或程序1、cmd命令2、Java程序 前言 查询电脑硬件CPU信息命令的学习&#xff0c;予以记录&#xff01; 参考博客&#xff1a;https://blog.csdn.net/huazicomeon/article/details/53540852 一、可视化界…

【计算机网络笔记】Web缓存/代理服务器技术

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

洗衣行业在线预约小程序+前后端完整搭建教程

大家好哇&#xff0c;好久不见&#xff01;今天源码师父来给大家推荐一款洗衣行业在线预约的小程序&#xff0c;带有前后端的完整搭建教程。 目前&#xff0c;人们对生活品质的追求不断提高&#xff0c;但生活节奏却也不断加快。对品质的追求遇到了忙碌的生活节奏&#xff0c;…

Linux ———— 管理磁盘

&#xff08;一&#xff09;MBR硬盘与GPT硬盘 硬盘按分区表的格式可以分为MBR硬盘与GPT硬盘两种硬盘格式。 MBR 硬盘&#xff1a;使用的是旧的传统硬盘分区表格式&#xff0c;其硬盘分区表存储在MBR(Master Boot Record&#xff0c;主引导区记录&#xff09;内。MBR位于…

【错误解决方案】ModuleNotFoundError: No module named ‘torch._six‘

1. 错误提示 在python程序中&#xff0c;试图导入一个名为torch._six的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named torch._six 2. 解决方案 出现这个错误可能是因为你使用的PyTorch版本和你的代码不兼容。在某…

OSPF,RIP和BGP的路由汇总

OSPF路由汇总 OSPF的路由汇总需要注意以下两点 1.OSPF的路由汇总仅支持手动汇总 注&#xff1a;距离矢量路由协议支持自动路由汇总&#xff0c;链路状态路由协议仅支持手动路由汇总&#xff08;OSPF,ISIS&#xff09; 2.OSPF的路由汇总只在区域边界进行汇总 OSPF的路由汇总…

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】

信息系统项目管理师教程 第四版【第3章-信息系统治理-思维导图】

Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动

时间序列数据是指在时间间隔不变的情况下收集的时间点数据&#xff0c;可以用来分析事物的长期发展趋势&#xff0c;并对未来进行预测。 date_range()方法及参数 pandas.date_range(startNone, endNone, periodsNone, freqNone, tzNone, normalizeFalse, nameNone, inclusive‘…

cosover是什么?crossover23又是什么软件

cosover是篮球里的过人技巧。 1.crossover在篮球中的本意是交叉步和急速交叉步。crossover 是篮球术语&#xff0c;有胯下运球、双手交替运球&#xff0c;交叉步过人、急速大幅度变向等之意。 2.在NBA里是指包括胯下运球、变向、插花在内的过人的技巧。 NBA有很多著名的Cross…

Pytorch整体工作流程代码详解(新手入门)

一、前言 本文详细介绍Pytorch的基本工作流程及代码&#xff0c;以及如何在GPU上训练模型&#xff08;如下图所示&#xff09;包括数据准备、模型搭建、模型训练、评估及模型的保存和载入。 适用读者&#xff1a;有一定的Python和机器学习基础的深度学习/Pytorch初学者。 本文…

vue3.0运行npm run dev 报错Cannot find module node:url

vue3.0运行npm run dev 报错Cannot find module 问题背景 近期用vue3.0写项目&#xff0c;npm init vuelatest —> npm install 都正常,npm run dev的时候报错如下&#xff1a; failed to load config from F:\code\testVue\vue-demo\vite.config.js error when starting…

buuctf_练[安洵杯 2019]easy_web

[安洵杯 2019]easy_web 文章目录 [安洵杯 2019]easy_web掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识 url地址和源代码的信息捕捉&#xff1b;图片和base64之间转换&#xff1b;base64和十六进制编码的了解&#xff1b;代码审计&#xff0c;绕过正则匹配对关键字的…

springboot配置redis、Spring cache

1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例&#xff1a; Testpublic void jedis(){Jedis jedis new Jedis("127…

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …

vscode C++项目相对路径的问题

如图所示的项目目录结构 如果要在main.cpp里用相对路径保存一个txt文件 std::ofstream file("./tree_model/my_file.txt");if (file.is_open()) {file << "This is a sample text.\n";file.close();std::cout << "File saved in the mode…

二叉树:什么样的二叉树适合用数组来存储?

文章来源于极客时间前google工程师−王争专栏。 前面我们讲的都是线性表结构&#xff0c;栈、队列等等。今天我们讲一种非线性表结构&#xff0c;树。树这种数据结构比线性表的数据结构要复杂得多&#xff0c;内容也比较多&#xff0c;所以我会分四节来讲解。 问题&#xff1…