断言21

简介: 断言21

断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。


我们先看一个例子:


public static void main(String[] args) {
    double x = Math.abs(-123.45);
    assert x >= 0;
    System.out.println(x);
}


语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError。

使用assert语句时,还可以添加一个可选的断言消息:


assert x >= 0 : "x must >= 0";

这样,断言失败的时候,AssertionError会带上消息x must >= 0,更加便于调试。


Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。


对于可恢复的程序错误,不应该使用断言。例如:


void sort(int[] arr) {
    assert arr != null;
}

应该抛出异常并在上层捕获:


void sort(int[] arr) {
    if (arr == null) {
        throw new IllegalArgumentException("array cannot be null");
    }
}



当我们在程序中使用assert时,例如,一个简单的断言:


// assert


Run


断言x必须大于0,实际上x为-1,断言肯定失败。执行上述代码,发现程序并未抛出AssertionError,而是正常打印了x的值。


这是怎么肥四?为什么assert语句不起作用?


这是因为JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。


要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。所以,上述程序必须在命令行下运行才有效果:


$ java -ea Main.java
Exception in thread "main" java.lang.AssertionError
  at Main.main(Main.java:5)


还可以有选择地对特定地类启用断言,命令行参数是:-ea:com.itranswarp.sample.Main,表示只对com.itranswarp.sample.Main这个类启用断言。


或者对特定地包启用断言,命令行参数是:-ea:com.itranswarp.sample...(注意结尾有3个.),表示对com.itranswarp.sample这个包启动断言。


相关文章
|
自然语言处理 分布式计算 前端开发
大模型应用开发入门分享
本文是作者给兄弟团队做的大模型入门分享,介绍了基本大模型模式,分享出来希望帮助更多的同学参与到LLM应用建设。
大模型应用开发入门分享
|
缓存 SpringCloudAlibaba NoSQL
Spring Boot多级缓存实现方案
整合redis和caffeine实现多级缓存,解决上面单一缓存的痛点,从而做到相互补足
1522 0
|
设计模式 Java 数据库连接
【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)
385 0
|
设计模式 JavaScript 前端开发
软件工程师,如何搞副业赚钱
在这个数字化时代,软件工程师凭借其深厚的技术功底与创新思维,早已成为推动社会经济发展的重要力量。然而,随着生活成本的提升以及对个人价值实现的追求,越来越多的软件工程师开始思考如何利用自身技能和业余时间开展副业,以实现“财务自由”和职业发展的双重目标。 当然,这里的“财务自由”打了引号。想通过副业实现“财务自由”还是非常有挑战性的,可能需要一定的机遇和运气。但在完成本职工作的基础上,通过搞副业赚钱,可以提升我们全方位的能力,并为后续的创业打下坚实的基础和储备。
739 5
|
Java 应用服务中间件 API
springboot+nginx获取真实IP
springboot+nginx获取真实IP
800 4
|
关系型数据库 测试技术 数据库
在 PostgreSQL 中使用 BETWEEN 操作符
【8月更文挑战第12天】
1239 0
|
XML Java API
springboot 常用的注解标签的概念及用法RequiredArgsConstructor 、RestController、RequestMapping
【4月更文挑战第12天】在 Spring Boot 中,@RequiredArgsConstructor, @RestController, 和 @RequestMapping 是常用的注解,每个都有其特定的功能和用法,它们合起来极大地简化了 Spring 应用程序的开发过程。
898 2
|
SQL 存储 Java
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
JDBC技术【封装JDBC工具类、Statement的使用、PreparedStatement的使用(重点)、ResultSet的使用】(二)-全面详解(学习总结---从入门到深化)
1163 0
|
存储 监控 安全
网络安全之认识日志采集分析审计系统
日志对于大家来说非常熟悉,机房中的各种系统、防火墙、交换机、路由器等等,都在不断地产生日志。无数实践告诉我们,健全的日志记录和分析系统是系统正常运营与优化以及安全事故响应的基础。我们一起来认识日志采集分析审计系统。
862 0
|
Kubernetes Cloud Native IDE
【技术干货】K8S环境微服务本地调试方法
随着云原生与微服务发展,新的Java开发栈基本上都切换到了微服务体系,部署环境也都切换到了基于K8S的云原生体系。在这一套体系下单体服务的开发和迭代得到了极大的效率提升,然而在后端服务之间存在依赖关系需要进行联调时也变得极为复杂,本文主要介绍一种在这种环境下的编码方式与联调方法供大家参考。
3622 0