浅析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中 ...
随机推荐
- SpringBoot:SpringBoot中@Value注入失败
1. 第一步检测语法是否正确 @Value("${test}") private String test; 2.第二步检测配置文件中是否有进行配置 url=testusername ...
- Thread对象 既传入了Runnable对象又重写了run()方法
Thread本身是一个类,其run(): 正常情况下, target(即传入的new Runnable()对象)不为空,就是执行target里面的run方法 但是,重新run()方法之后,就不会在执行 ...
- 将gitlab内置node_exporter提供外部prometheus使用
目录 修改gitlab的配置 重新初始化配置 gitlab服务已经包含了node_exporter服务,但是配置文件限制了9100端口的访问,所以主机信息不能直接被外部的prometheus收集 修改 ...
- ARTS第五周
-第五周.这两周在复习大学里的课程,发现当时觉得课上很多看不懂的,现在看起来轻松多了,也带来了新的感悟. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评 ...
- 开发必备linux命令大全-稳赚不亏
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...
- C++11标准特性的一些理解
(1)auto 和 decltype 关键字 在C++11之前,auto关键字用来指定存储期(C++98中指的是自动生命周期).在新标准中,它的功能变为类型推断.C++11引入auto关键词与之前C语 ...
- 【剑指offer】73.数组中出现次数超过一半的数字
73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...
- YARN学习总结之架构
一.yarn产生背景 1) 源于MRv1的缺陷:扩展性受限.单点故障.难以支持MR之外的计算框架: 2) 多计算框架各自为战,数据共享困难,资源利用率低: MR: 离线计算框架 Storm:实时计算框 ...
- 《手把手教你》系列技巧篇(十一)-java+ selenium自动化测试-元素定位大法之By tag name(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...
- ElasticSearch简介和快速实战
ElasticSearch简介和快速实战 ElasticSearch与Lucene Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库(框架) 但是想要使用Lucene,必须使用 ...