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断言的更多相关文章

  1. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  2. 浅析Java.lang.Process类

    一.概述      Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序).      Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...

  3. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  4. Java断言assert

    public class Welcome{ public static void main(String[] args){ assert false; System.out.println(" ...

  5. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  6. java断言

    public class New{ public static void main(String[] args){ assert false; System.out.println("pas ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. K:java 断言 assert 初步使用:断言开启、断言使用

    @转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...

  9. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...

随机推荐

  1. SpringBoot:SpringBoot中@Value注入失败

    1. 第一步检测语法是否正确 @Value("${test}") private String test; 2.第二步检测配置文件中是否有进行配置 url=testusername ...

  2. Thread对象 既传入了Runnable对象又重写了run()方法

    Thread本身是一个类,其run(): 正常情况下, target(即传入的new Runnable()对象)不为空,就是执行target里面的run方法 但是,重新run()方法之后,就不会在执行 ...

  3. 将gitlab内置node_exporter提供外部prometheus使用

    目录 修改gitlab的配置 重新初始化配置 gitlab服务已经包含了node_exporter服务,但是配置文件限制了9100端口的访问,所以主机信息不能直接被外部的prometheus收集 修改 ...

  4. ARTS第五周

    -第五周.这两周在复习大学里的课程,发现当时觉得课上很多看不懂的,现在看起来轻松多了,也带来了新的感悟. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评 ...

  5. 开发必备linux命令大全-稳赚不亏

    我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...

  6. C++11标准特性的一些理解

    (1)auto 和 decltype 关键字 在C++11之前,auto关键字用来指定存储期(C++98中指的是自动生命周期).在新标准中,它的功能变为类型推断.C++11引入auto关键词与之前C语 ...

  7. 【剑指offer】73.数组中出现次数超过一半的数字

    73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...

  8. YARN学习总结之架构

    一.yarn产生背景 1) 源于MRv1的缺陷:扩展性受限.单点故障.难以支持MR之外的计算框架: 2) 多计算框架各自为战,数据共享困难,资源利用率低: MR: 离线计算框架 Storm:实时计算框 ...

  9. 《手把手教你》系列技巧篇(十一)-java+ selenium自动化测试-元素定位大法之By tag name(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...

  10. ElasticSearch简介和快速实战

    ElasticSearch简介和快速实战 ElasticSearch与Lucene Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库(框架) 但是想要使用Lucene,必须使用 ...