浅析Java断言
Java断言
1.断言的概念
Java的断言机制assert是一种用于测试阶段的语法特性,它允许我们在测试期间向代码中插入一些检查语句。代码发布时这些检测语句将被自动移除。
断言关键字assert有下列两种形式
- assert 条件;
- assert 条件:表达式;
当结果为false时,会抛出一个AssertionError
异常。在第二种形式中,表达式将被传入异常的构造器,构造出你想要的一种消息字符串。
注意这个消息字符串仅在这个时候被创建并跟随异常展示出来,而不能以任何方式被保存。因为如果保存为一个内存中的变量,意味着断言机制可能脱离测试环境而影响到代码的真实运行。
例如,我们要断言x是一个正数,只需要使用以下形式。
assert x > 0;
也可以将x的值传递给异常构造器,从而显示。
assert x > 0 : x;
2. 启用和禁用断言
默认情况下断言被禁用,可以在运行程序时用-enableassertions
或-ea
这两个参数中的一个来启用。
启用和禁用断言时不需要重新编译程序,因为启用和禁用断言是类加载器的功能,而类加载器在解释字节码阶段运行。
也可以在某个类或者整个包中使用断言,如
java -ea:MyClass -ea:com.pedro.src... MyApp
这段代码将开启
MyClass
类以及com.pedro.src
包和它的所有子包中的断言。也可以用选项
-disableassertions
或-da
禁用某个特定类和包的断言java -ea:... -da:MyClass MyApp
3.使用断言完成参数检查
使用断言有两个需要注意的条件
- 断言失败应该是一种致命且不可恢复的错误。
- 断言检查只用于开发和测试阶段,它只用于程序员或测试人员确定程序内部的错误位置。
例如我们有一个方法签名
static void sort(int[] array,int x,int y){
...
}
我们希望拒绝null数组调用这个方法,那我们应该这样做。
static void sort(int[] array,int x,int y){
assert a != null;
...
}
这样的在方法开头检查参数的形式我们称为前置条件。
4.为文档中的假设使用断言
以下是一段示例代码,我们试图用注释的方式说明一个if-else分支中的假设。
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else // (i % 3 == 2)
...
我们也可以用断言做这件事
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...
但是实际上,如果我们是经验丰富的工程师,我们应该会考虑到i
可能是一个负值,所以最好在 if 语句之前使用另一个断言。
assert i >= 0;
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...
浅析Java断言的更多相关文章
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- Java断言assert
public class Welcome{ public static void main(String[] args){ assert false; System.out.println(" ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- java断言
public class New{ public static void main(String[] args){ assert false; System.out.println("pas ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- K:java 断言 assert 初步使用:断言开启、断言使用
@转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
随机推荐
- 暑假自学java第九天
1,接口回调是指:可以将接口实现类的对象赋给该接口声明的接口变量,那么该接口变量就可以调用接口实现类对象中的方法.不同的类在使用同一接口时,可能具有不同的功能体现,即接口实现类的方法体不必相同,因此, ...
- SpringBoot:SpringCloud与SpringBoot兼容版本参(其它组件兼容情况)
SpringCloud --- Springboot 版本兼容 SpringCloud SpringBoot Edgware.SR5 >=1.5.0.RELEASE and <=1.5.2 ...
- Android单元测试问题解决
1.'java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked'报错 https://www.ji ...
- Linux | 命令的参数
命令的参数 格式:command parameters --> 命令参数 短参数 在短参数中,字母的大写效果是不同的,比如大写 T 和小写 t 的含义通常是不同的. 一个短参数 最常用的参数形式 ...
- DHCP工作原理
DHCP:Dynamic Host Configurtion Protocol DHCP的工作原理(UDP) 1.客户端:首先会发送给一个dhcp discovery(广播)报文,报文中的2层和3层都 ...
- BiPredicate的test()方法
/** * BiPredicate的test()方法接受两个参数,x和y,具体实现为x.equals(y), * 满足Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的 ...
- [刘阳Java]_Spring AOP注解详细介绍_第8讲
这节内容非常关键,我们会比较详细地介绍Spring AOP注解的使用 1. 要使用Spring AOP注解,必须满足如下的事项 导入Aspectj的jar.Spring3.0-AOP.jar.aopa ...
- Kubernetes部署-RKE自动化部署
一.简介 RKE:Rancher Kubernetes Engine 一个极其简单,闪电般快速的Kubernetes安装程序,可在任何地方使用. 二.准备工作 I.配置系统 系统:CentOS 7 / ...
- 微信小程序云开发-云存储的应用-识别通用印刷体
一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...
- 微信小程序云开发-数据库-商品列表数据排序
一.wxml添加升序和降序 在商品列表的wxml文件中添加超链接a标签,分别用于升序和降序的点击.分别绑定升序和降序的点击事件. 二.js文件实现升序和降序 分别写对应的按价格升序函数sortByPr ...