java 中的断言assert的使用

1、assertion的意义和用法 

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

从理论上来讲,经过 assertion方式能够证实程序的正确性,可是这是一项至关复杂的工做,目前尚未太多的实践意义。

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

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

一、语法表示

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

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

二、含义

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

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

一种特殊状况是,若是在计算表达式时,表达式自己抛出Exception,那么assert将中止运行,而抛出这个Exception。

三、编译

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

你们在使用eclipse,jbuilder等IDE工具的时候,要注意编译器的版本,使用的jre,不等因而javac 的版本

方法入参检测工具类java

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

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

} express

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

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[] 类型的入参进行判断; ui

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 容器,您能够大胆地在本身的应用中使用这个工具类。

相关文章
相关标签/搜索