java中的断言assert的使用

一、assertion的意义和用法

J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新。

从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的时间意义。

在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。

一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

1、语法表示

在语法上,为了支持assertion,Java增加了一个关键字assert。它包括两种表达式,分别如下:

assert expression1;

assert expression1:expression2;

在两种表达式中,expression1表示一个boolean表达式, expression2表示一个基本类型或者是一个对象(Object),基本类型包括boolean,char,double,float,int和 long。由于所有类都为Object的子类,因此这个参数可以用于所有对象。

2、含义

在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。

如果assertion语句包括expression2参数,程序将计算出 expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对 象;如果expression1值为true,expression2将不被计算。

一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。

3、编译

由于assert是一个新关键字,使用老版本的JDK是无法编译带有assert的 源程序。因此,我们必须使用JDK1.4(或者更新)的Java编译器,在使用Javac命令时,我们必须加上-source 1.4作为参数。-source 1.4表示使用JDK 1.4版本的方式来编译源代码,否则编译就不能通过,因为缺省的Javac编译器使用JDK1.3的语法规则。

大家在使用eclipse,jbuilder等IDE工具的时候,要注意编译器的版本,使用的jre,不等于是javac 的版本

方法入参检测工具类

Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回。类似的,当我们在编写类的方法时,也常常需要对方法入参进行合法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理。举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理。这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测的代码,如下所示:

public InputStream getData(String file) { if (file == null || file.length() == 0|| file.replaceAll("\s", "").length() == 0) { throw new IllegalArgumentException("file入参不是有效的文件地址"); } … }

类似以上检测方法入参的代码是非常常见,但是在每个方法中都使用手工编写检测逻辑的方式并不是一个好主意。阅读 Spring 源码,您会发现 Spring 采用一个 org.springframework.util.Assert 通用类完成这一任务。

Assert 翻译为中文为“断言”,使用过 JUnit 的读者都熟知这个概念,它断定某一个实际的运行值和预期想一样,否则就抛出异常。Spring 对方法入参的检测借用了这个概念,其提供的 Assert 类拥有众多按规则对方法入参进行断言的方法,可以满足大部分方法入参检测的要求。这些断言方法在入参不满足要求时就会抛出 IllegalArgumentException。下面,我们来认识一下 Assert 类中的常用断言方法:

断言方法说明

notNull(Object object)当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息。和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入参一定是 null;

isTrue(boolean expression) / isTrue(boolean expression, String message)当 expression 不为 true 抛出异常;

notEmpty(Collection collection) / notEmpty(Collection collection, String message)当集合未包含元素时抛出异常。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断;

hasLength(String text) / hasLength(String text, String message)当 text 为 null 或长度为 0 时抛出异常;

hasText(String text) / hasText(String text, String message)text 不能为 null 且必须至少包含一个非空格的字符,否则抛出异常;

isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)如果 obj 不能被正确造型为 clazz 指定的类将抛出异常;

isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)subType 必须可以按类型匹配于 superType,否则将抛出异常;

使用 Assert 断言类可以简化方法入参检测的代码,如 InputStream getData(String file) 在应用 Assert 断言类后,其代码可以简化为以下的形式:

public InputStream getData(String file){ Assert.hasText(file,"file入参不是有效的文件地址"); 使用 Spring 断言类进行方法入参检测 … }

可见使用 Spring 的 Assert 替代自编码实现的入参检测逻辑后,方法的简洁性得到了不少的提高。Assert 不依赖于 Spring 容器,您可以大胆地在自己的应用中使用这个工具类。

简而言之,断言就是一个帮助程序员来简化入参检测代码的工具类

java断言assert的概念_断言(assert)简介相关推荐

  1. java中递归的概念_【Java】基础38:什么叫递归?

    今天是我自学Java的第38天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 递归:不要看这个名字好像挺高大上的样子,其实理解起来还是蛮容易的. 在学习递归之前,我们先学习下目录的遍历,递归的 ...

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

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

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

    主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言只适用于复杂的调试过程. 断言一般用于程序执行结果的判断 ...

  4. java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...

  5. java的断言_java断言assert初步使用:断言开启、断言使用

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

  6. C语言_断言函数assert

    断言函数assert 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,asser ...

  7. 使用 BOOST.ASSERT 机制替换库断言

    使用 BOOST.ASSERT 机制替换库断言 实现功能 C++实现代码 实现功能 使用 BOOST.ASSERT 机制替换库断言 C++实现代码 #include <boost/core/li ...

  8. python中断言语句的语法,python断言语句的语法【assert语句】

    assert语句又称作断言,指的是期望用户满足指定的条件.当用户定义的约束条件不满足的时候,它会触发AsserionError异常,所以assert语句可以当作条件式的raise语句.assert语句 ...

  9. java学习笔记:什么时候用assert?

    什么时候用assert? 答:assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制. 一般来说,assertion用于保证程序最基本.关键的正确性.assertio ...

最新文章

  1. Forrester:全球供应商在中国处于领导地位 但本土供应商却在私有云市场蒸蒸日上...
  2. 16.实现多个具有相同方法的接口和父类与实现接口有相同方法
  3. WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置
  4. can收发器 rx_CANOpen系列教程03 _CAN收发器功能、原理及作用
  5. git+pylint实现python提交代码格式校验
  6. 一些经典的前端文章合集地址
  7. 数学最高奖菲尔兹奖得主加入Huawei Technologies France
  8. python设计模式-模板方法模式
  9. scratch趣味编程——挖矿小游戏
  10. DirectX 3D图形
  11. Macbook安装pkg
  12. 生成Xcode中各个尺寸的Mac App Icon
  13. 【用于图像修复、数据增强等】结合官方代码教程,在Windows 10下运行pix2pix-tensorflow(tensorflow==1.4.0 python=3.6)
  14. 江苏注册入学学校计算机,江苏高职(专科)院校注册入学试点院校名单即将公布...
  15. 从GPT-1到GPT-4看ChatGPT的崛起
  16. 【C语言】随机数函数rand和srand
  17. ctP2ISP:使用卷积和数据增强的转换器预测蛋白质-蛋白质相互作用位点
  18. 34.驱动--块设备驱动
  19. 1.2、通过WiFi模块连接手机控制小灯的亮灭(AT指令)
  20. layout_*的一些注意事项

热门文章

  1. qq登陆及获取头像信息
  2. 大部分网站百度快照回档总结分析
  3. Java中的常见的锁及其内存语义
  4. 一文看懂哈希表并学会使用C++ STL 中的哈希表
  5. 第十三届蓝桥杯javac组决赛准备
  6. 刷爆北美餐饮圈的大事件!顶级餐饮大咖十个锦囊在此!
  7. 抖音直播间:公屏信息解析(纯协议方式)
  8. linux安装百度云盘
  9. Instrumentation 应用简介
  10. 未满18岁不得注册(不知道15位身份证号码怎么验证)