断言(Assertion)是Java中一条语句,包含一个布尔表达式,当该布尔值为真,程序则被认为是正确的;当布尔值为假,则系统会抛出错误。

断言默认禁用的,在开发时候可开启功能,有利于纠正错误,增加可维护性。

PS:断言,换句话就是 立flag,false则啪啪啪打脸。

断言两种语句形式

assert Expression1 ;
assert Expression1 : Expression2 ;

Expression1是一个布尔表达式,作为断言的真假。

Expression2是一个有返回值的表达式,用来提供详细的错误信息。

当没有Expression2时,默认抛出没有详细信息的 AssertionError。

用断言的场景

1、变量值明确

变量值如果很确定是某个值,则可以用断言。

2、执行不到的语句

某个地方语句确定是执行不会达到的,例如没有default的switch,则default可加上断言。

3、前置条件

前置条件(precondition)是一条语句,在方法执行前必须为真。

例子:判断线程的拥有锁,结合断言,可以测试当前线程是否拥有某对象的锁。

private Object[] a;
public synchronized int find(Object key) {
return find(key, a, 0, a.length);
}
// Recursive helper method - always called with a lock on this.
private int find(Object key, Object[] arr, int start, int len) {
assert Thread.holdsLock(this); // lock-status assertion
...
}

我觉得前置条件的异常不要用断言为好,无论是public还是private方法。

4、后置条件

后置条件(postcondition)是一条语句,当前置条件满足且完全执行方法后,它为真。

/**
* Returns a BigInteger whose value is (this-1 mod m).
*
* @param m the modulus.
* @return this-1 mod m.
* @throws ArithmeticException m <= 0, or this BigInteger
*has no multiplicative inverse mod m (that is, this BigInteger
*is not relatively prime to m).
*/
public BigInteger modInverse(BigInteger m) {
if (m.signum <= 0)
throw new ArithmeticException("Modulus not positive: " + m);
... // Do the computation
assert this.multiply(result).mod(m).equals(ONE) : this;
return result;
}

5、检查类的状态

加一个内部方法,返回布尔值,当检查类状态正常时返回true。

不要用断言场景

1、不要用断言做参数检查

因为无论断言是启用还是禁用,都必须进行参数检查的,而断言是可能被禁用的。并且断言报出的AssertionError异常,不能准确反馈运行时异常(例如IllegalArgumentException,IndexOutOfBoundsException或NullPointerException)。

2、不要用断言来完成程序正确操作所需的任何工作

例如,假设你想要从列表名称中删除所有空元素,并且知道该列表包含一个或多个空值。

错误的做法:

//行为包含在断言中
assert names.remove(null);

当断言被启用时,程序会正常工作,但在禁用时会失败,因为它不再从列表中删除空元素。

正确的用法:

//固定 - 动作先于断言
boolean nullsRemoved = names.remove(null);
assert nullsRemoved; //运行是否启用断言

开启断言

可在eclipse运行配置中VM arguments,添加-ea。

参考文献

https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html

Java断言(Assertion)的更多相关文章

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

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

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

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说“断言不具有继承性”. 断言只适用复杂的调式过程. ...

  3. 01 java断言assert初步使用:断言开启、断言使用

    参考文件:http://blog.sina.com.cn/s/blog_59c9412d0100fd55.html 1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. ...

  4. java assert的使用并深入解析Java的assertion

    java assert的使用并深入解析Java的assertion 分类: java2012-12-05 13:32 2020人阅读 评论(0) 收藏 举报 原文出处:http://blog.csdn ...

  5. Java断言assert

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

  6. java断言

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

  7. SQL入门(3):定义约束/断言assertion/触发器trigger

    本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...

  8. Selenium3 + Python3自动化测试系列五——常用断言Assertion

    断言Assertion 验证应用程序的状态是否同所期望的一致. 常见的断言包括:验证页面内容,如标题是否为X或当前位置是否正确,或是验证该复选框是否被勾选. selenium 提供了三种模式的断言:a ...

  9. 【转】Python中不尽如人意的断言Assertion

    原文地址:Python中不尽如人意的断言Assertion Python Assert 为何不尽如人意 Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛 ...

随机推荐

  1. python模块之shutil

    shutil是一个用于简化文件操作的模块. 复制文件(传入源文件对象和目标文件对象) import shutil f1 = open(r'/Users/jingxing/PycharmProjects ...

  2. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  3. springBoot系列-->springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  4. C# MVC 基于From的身份验证

    前言 昨天和一个技术比较好的前辈聊了聊,发现有的时候自己的学习方式有些问题,不知道有没有和我一样的越学习越感觉到知识的匮乏不过能认识到这个问题的同学们,也不要太心急路是一步一步走的饭是一口一口吃的认识 ...

  5. Android Studio 新建项目结构分析

    这是我刚刚新建的项目  默认都是Android模式的项目结构,但这并不是真实的目录结构 把他换成Project模式 项目的真实目录结构 1app 项目的代码,资源 2 gradle  wrappere ...

  6. 推送GitHub报错 fatal: Out of memory, malloc failed 解决办法

    现象: 推送GitHub时,出现如下报错 fatal: Out of memory, malloc failed (tried to allocate XXXXXX bytes)error: fail ...

  7. python基础学习(十一)公共方法

    Python内置函数 Python 包含了以下内置函数: 切片 切片 使用 索引值 来限定范围,从一个大的 字符串 中 切出 小的 字符串 列表 和 元组 都是 有序 的集合,都能够 通过索引值 获取 ...

  8. Hibernate入门(四)---------一级缓存

    Hibernate一级缓存 Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对 ...

  9. 25.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1)

    查看Odoo产品分析系列--目录 工资表不在"应用"中,在搜索该模块时需要将默认的"应用"过滤删除掉.  安装工资表后,出现工资单菜单:  1. 薪资规则类别 ...

  10. 利用SurfaceView显示正弦曲线,仿造示波器

    众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...