断言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这个包启动断言。


相关文章
|
4月前
|
人工智能
assert()函数(断言函数)
assert()函数(断言函数)
assert()函数(断言函数)
|
4月前
|
传感器 安全 编译器
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
115 0
|
测试技术 Python
Pytest断言
Pytest断言
53 0
|
4月前
|
测试技术 数据库
接口测试断言
接口测试断言
52 0
|
测试技术
|
XML JSON 搜索推荐
Jmeter常用断言之响应断言详解
**响应断言**是最常用的一种断言方法,主要是对响应结果中的文本内容进行断言,比如响应结果是否包含指定的值,或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果,如:Test、html、application/json、application/xml等。。。
408 0
Jmeter常用断言之响应断言详解
|
JSON 搜索推荐 Java
Jmeter常用断言之BeanShell断言详解
BeanShell断言可以使用beanshell脚本来执行断言检查,可以用于更复杂的个性化需求,使用更灵活,功能更强大,但是要能够熟练使用beanshell脚本。在这里主要通过 Failure 和 FailureMessage来设置断言结果。 Failure = false;-----表示断言成功 FailureMessage = “......";---自定义的成功信息 Failure = true;----表示断言失败 FailureMessage="=".....";---自定义的失败信息
361 0
Jmeter常用断言之BeanShell断言详解
|
JavaScript 前端开发 编译器
TypeScript入门之类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名
TypeScript学习过程中经常会看到类型推断、类型断言、双重断言、非空断言、确定赋值断言、类型守卫、类型别名,这几个概念到底表示啥呢?你真的搞清楚了吗?今天我们就来盘一盘它,帮你一次性弄懂。
290 0