Java工具类-assert断言

news2025/4/14 20:04:11

我们可能经常在项目的单元测试或者一些源码中看到别人在使用assert关键字,当然也不只是Java语言,很多编程语言也都能看到,我们大概知道断言可以用于测试中条件的校验,但却不经常使用,本文总结了Java中该工具类的使用。

一、简介

断言:
“断言”一词源自英文 Assert,原意为“明确肯定地陈述”,或者说叫“断定某个条件必然成立”。在编程中,开发者通过断言明确肯定地声明某个条件应该成立,否则程序证明程序有缺陷。

二、assert 关键字

assert 是Java语言内置的关键字,在Java 1.4中被引入,用于在代码中进行条件断言,其语法形式如下:

// 形式1:简单条件检查
assert booleanExpression;

// 形式2:附带错误信息
assert booleanExpression : "Error message";

若表达式为false,则会抛出AssertionError异常并终止程序,如果附带错误信息,则会将错误信息作为AssertionError的详细信息输出,示例如下:

public class AssertExample {
    public static void main(String[] args) {
        validateAge(25);   // 合法年龄
        validateAge(-5);   // 断言失败!
    }
    // 示例1:检查年龄合法性(简单断言)
    public static void validateAge(int age) {
        assert age >= 0 && age <= 120;  // 断言年龄在合理范围
        System.out.println("年龄验证通过: " + age);
    }
    // 示例1:检查年龄合法性(带错误信息)
    public static void validateAge2(int age) {
        assert age >= 0 && age <= 120 : "";  // 断言年龄在合理范围
        System.out.println("年龄验证通过: " + age);
    }
}

validateAage执行打印如下:

年龄验证通过: 25
Exception in thread "main" java.lang.AssertionError
	at org.example.asserts.AssertExample.validateAge(AssertExample.java:15)
	at org.example.asserts.AssertExample.main(AssertExample.java:11)

validateAage2执行打印如下:

年龄验证通过: 25
Exception in thread "main" java.lang.AssertionError: 年龄不合法
	at org.example.asserts.AssertExample.validateAge2(AssertExample.java:20)
	at org.example.asserts.AssertExample.main(AssertExample.java:11)

启用断言

默认情况下断言是关闭的,需通过JVM参数启用:
如IDEA在IntelliJ中,需在VM参数中添加-ea(-enable assertions 命令的缩写)以生效, -da 表示禁止断言
在这里插入图片描述

适用场景

  • 检查private方法的合法性(如非空、范围等)。
  • 用于基类、工具类或框架代码,避免冗余的if判断

注意事项

  • 断言错误是 AssertionError,属于严重错误,通常不捕获。
  • 如果参数由类自身逻辑控制(如内部调用),用 assert 替代 if。
  • 如果参数来自外部不可控输入(如用户传递),仍需用 if + throw

二、Assert 类

Assert 类通常来自测试框架或工具类(如JUnitHutoolSpringAssert工具类),用于编写测试用例的断言。这些断言始终启用,与JVM参数无关。
以下是常见库中 Assert 类的详细介绍及用法示例:

JUnit 的 Assert 类

JUnit是一个广泛使用的单元测试框架,其中包含用于编写测试断言的方法
JUnit 4org.junit.Assert

import static org.junit.Assert.*;

assertEquals("期望值", actualValue);   // 验证相等性
assertTrue(condition);                // 验证条件为真
assertNotNull(object);                // 验证对象非空
assertArrayEquals(expectedArray, actualArray); // 验证数组相等
...

JUnit 5org.junit.jupiter.api.Assertions(支持更丰富的断言和错误信息)

import static org.junit.jupiter.api.Assertions.*;

assertEquals(expected, actual, () -> "动态错误信息"); // 支持Lambda表达式
assertThrows(Exception.class, () -> methodCall());  // 验证抛出异常
assertTimeout(Duration.ofSeconds(1), () -> task()); // 验证执行时间
...

Spring Framework 的 Assert 类

org.springframework.util.Assert
用途:用于方法参数校验和业务逻辑验证,通常在服务层或工具类中快速失败,校验失败时抛出 IllegalArgumentExceptionIllegalStateException,适合生产环境使用,与测试框架的断言不同,Spring的 Assert 主要用于防御性编程而非单元测试

import org.springframework.util.Assert;

Assert.notNull(object, "对象不能为null");        // 非空校验
Assert.isTrue(condition, "条件必须为真");        // 条件校验
Assert.hasLength(str, "字符串不能为空");         // 字符串非空校验
Assert.state(condition, "状态不合法");           // 状态校验
...

示例:

public void processOrder(Order order) {
    Assert.notNull(order, "订单对象不能为null");
    Assert.isTrue(order.getAmount() > 0, "订单金额必须大于0");
    // 处理逻辑
}

Apache Commons Lang 的 Validate 类

org.apache.commons.lang3.Validate
用途:类似于Spring的 Assert,用于参数校验,但语法更灵活。

import org.apache.commons.lang3.Validate;

Validate.notNull(object, "参数 %s 不能为null", "object");  // 支持格式化消息
Validate.validState(condition, "状态无效: %s", errorMsg);  // 状态校验
Validate.isTrue(condition, "条件不满足: %d", value);        // 条件校验
...

示例:

public void setPrice(double price) {
    Validate.isTrue(price >= 0, "价格不能为负数: %f", price);
    this.price = price;
}

Hutool 的 Assert 类

Hutool 的 Assert 类似于 Spring 和 Apache Commons 的校验工具

import cn.hutool.core.lang.Assert;

Assert.notNull(obj); // 检查对象非 null
Assert.isTrue(condition); // 检查条件为 true
Assert.notEmpty(collection) // 检查集合非空
Assert.noNullElements(array) // 检查数组/集合中无 null 元素

特点

  • 无侵入性:不依赖 Spring 等框架,适合纯 Java 项目
  • 简洁 API:方法命名直观(如 notBlank 直接校验字符串非空白)
  • 轻量级:只需引入 hutool-core,适合中小型项目。

三、使用区别

在编写代码的时候,什么时候用assert关键字,什么时候用Assert类(如 JUnit、Spring、Hutool 等提供的),又什么时候可以直接if + throw来进行条件检查呢?
assert关键字需要显示开启才能生效,一般用于测试调试程序时来使用,而且assert断言失败后会导致程序的退出,一般生产环境代码校验我们可以用Assert类,对于复杂逻辑和自定义的异常我们可以使用if + throw来抛出异常

机制适用场景错误类型是否默认启用典型用途
assert开发阶段内部逻辑检查AssertionError需要 -ea私有方法假设
Assert测试断言或生产参数校验测试失败/IAE/NPE始终单元测试、公共API输入校验
if+throw需要自定义异常或复杂校验逻辑任意异常始终复杂或业务规则校验

总结:
断言作为一种编程机制,用于确保程序中特定条件为真,有助于简化代码并提高代码质量。我们可以根据不同需求选择合适的断言机制,从而在实际开发中更有效地提升代码的健壮性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能、机器学习与深度学习-AI基础Day2

核心概念与技术全景解析 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术飞速发展&#xff0c;逐渐渗透到生活的方方面面。然而&#xff0c;对于许多人来说&#xff0c;AI、机器学习&#xff08;ML&#xff09;、深度学习&#xff08;DL&#xff09;以及生成式人工…

GGML源码逐行调试(上)

目录 前言1. 简述2. 环境配置3. ggml核心概念3.1 gguf3.2 ggml_tensor3.3 ggml_backend_buffer3.4 ggml_context3.5 backend3.6 ggml_cgraph3.7 ggml_gallocr 4. 推理流程整体梳理4.1 时间初始化与参数设置4.2 模型加载与词汇表构建4.3 计算图与内存分配4.4 文本预处理与推理过…

SpringCloud-OpenFeign

前言 1.存在问题 远程调用可以像Autowired一样吗 服务之间的通信⽅式,通常有两种:RPC和HTTP. 在SpringCloud中,默认是使⽤HTTP来进⾏微服务的通信,最常⽤的实现形式有两种&#xff1a; RestTemplate OpenFeign RPC&#xff08;RemoteProcedureCall&#xff09;远程过程调⽤&…

撰写学位论文Word图表目录的自动生成

第一步&#xff1a;为图片和表格添加题注 选中图片或表格 右键点击需要编号的图片或表格&#xff0c;选择 【插入题注】&#xff08;或通过菜单栏 引用 → 插入题注&#xff09;。 设置题注标签 在弹窗中选择 标签&#xff08;如默认有“图”“表”&#xff0c;若无需自定义标…

Web 项目实战:构建属于自己的博客系统

目录 项目效果演示 代码 Gitee 地址 1. 准备工作 1.1 建表 1.2 引入 MyBatis-plus 依赖 1.3 配置数据库连接 1.4 项目架构 2. 实体类准备 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 统一响应结果类 - Result 2.3.2 用户登录响应类 2.3.3…

【随行付-注册安全分析报告-无验证方式导致隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

什么是原型、原型链?

一、原型 每个函数都有一个prototype属性&#xff0c;称之为原型&#xff0c;也称为原型对象。 原型可以放一些属性和方法&#xff0c;共享给实例对象使用。原型可以用作继承 二、原型链 对象都有_proto_属性&#xff0c;这个属性指向它的原型对象&#xff0c;原型对象也是…

ChatGPT的GPT-4o创建图像Q版人物提示词实例展示

最近感觉GPT-4o发布的新功能真的强大&#xff0c;所以总结了一些提示词分享给大家&#xff0c;大家可以去试试&#xff0c;玩法多多&#xff0c;可以用GPT-4o生成图片&#xff0c;然后用可灵进行图生视频&#xff0c;就能去发布视频了&#xff01;接下来和笔者一起来试试&#…

StringBuffer类基本使用

文章目录 1. 基本介绍2. String VS StringBuffer3. String和StringBuffer相互转换4. StringBuffer类常见方法5. StringBuffer类测试 1. 基本介绍 java.lang.StringBuffer 代表可变的字符序列&#xff0c;可以对字符串内容进行增删很多方法与String相同&#xff0c;但StringBuf…

基于 Maven 构建的 Thingsboard 3.8.1 项目结构

一、生命周期&#xff08;Lifecycle&#xff09; Maven 的生命周期定义了项目构建和部署的各个阶段&#xff0c;图中列出了标准的生命周期阶段&#xff1a; clean&#xff1a;清理项目&#xff0c;删除之前构建生成的临时文件和输出文件。validate&#xff1a;验证项目配置是否…

为啥物联网用MQTT?

前言 都说物联网用MQTT&#xff0c;那分别使用Http和Mqtt发送“Hello”&#xff0c;比较一下就知道啦 HTTP HTTP请求报文由请求行、头部字段和消息体组成。一个最简单的HTTP POST请求如下&#xff1a; POST / HTTP/1.1 Host: example.com Content-Length: 5 Content-Type: …

小甲鱼第004讲:变量和字符串(下)| 课后测试题及答案

问答题: 0. 请问下面代码有没有毛病&#xff0c;为什么? 请问下面代码为什么会出错&#xff0c;应该如何解决&#xff1f; 答:这是由于在字符串中&#xff0c;反斜杠()会与其随后的字符共同构成转义字符。 为了避免这种不测情况的发生&#xff0c;我们可以在字符串的引号前面…

MergeX亮相GTC2025:开启全球广告流量交易新篇章

全球流量盛宴GTC2025深圳启幕&#xff0c;共探出海新蓝海 2025年4月24日至25日&#xff0c;GTC2025全球流量大会将在深圳福田会展中心9号馆隆重召开。作为跨境出海领域内规模最大、资源最丰富、产业链最完备的年度盛会&#xff0c;此次大会将汇聚众多行业精英&#xff0c;共同探…

STM32(基于标准库)

参考博客&#xff1a;江科大STM32笔记 Stm32外设 一、GPIO 基础 GPIO位结构 I/O引脚的保护二极管是对输入电压进行限幅的上面的二极管接VDD, 3.3V,下面接VSS, 0V&#xff0c;当输入电压 >3.3V 那上方这个二极管就会导通&#xff0c;输入电压产生的电流就会大部分充入VD…

国家优青ppt美化_青年科学基金项目B类ppt案例模板

国家优青 国家优青&#xff0c;全称“国家优秀青年基金获得者”。2025改名青年科学基金B类。 作为自然基金人才资助类型&#xff0c;支持青年学者在基础研究方面自主选择研究方向开展创新研究。它是通往更高层次科研荣誉的重要阶梯&#xff0c;是准杰青梯队。 / WordinPPT /…

解决 ECharts 图表无数据显示问题

问题&#xff1a; 在开发项目时&#xff0c;后端明明已经成功返回了数据&#xff0c;但在展示手账发布数量趋势和树洞帖子发布数量趋势的 ECharts 图表中&#xff0c;却只有坐标轴&#xff0c;没有任何数据显示。 以我的VUE项目开发可视化面板为例&#xff0c;下面将详细分析可…

spacy安装失败报错

报错 使用命令pip install spacy安装spacy时总是报错&#xff08;python -m pip install spacy方式安装同样报错&#xff09; 解决办法 使用conda安装&#xff0c;conda能够避免很多不必要的依赖包。 命令&#xff1a;conda install spacy 安装成功列表展示

C++在Linux上生成动态库并调用接口测试

加减乘除demo代码 项目结构 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 头文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…

前端性能测试工具 —— WebPageTest

测试工具介绍 WebPageTest 是一个用于测量和分析网页性能的工具。它提供了详细的诊断信息&#xff0c;帮助用户了解网页在不同条件下的表现。用户可以选择全球不同的测试地点&#xff0c;使用真实的浏览器&#xff0c;并自定义网络条件进行测试。WebPageTest 还支持核心网络指…

北邮LLMs在导航中的应用与挑战!大模型在具身导航中的应用进展综述

作者&#xff1a;Jinzhou Lin, Han Gao, Xuxiang Feng, Rongtao Xu, Changwei Wang, Man Zhang, Li Guo, Shibiao Xu 单位&#xff1a;北京邮电大学人工智能学院&#xff0c;中国科学院自动化研究所多模态人工智能系统国家重点实验室&#xff0c;中科院空间信息研究所&#xf…