ASSERT是在调试与测试环境,让程序员和测试者及时发现运行时错误的极简极佳之方法。
其语法如下:
在语法上,为了支持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将不被计算。
详尽说明(点这里)。
它的语法因为简单所以美丽。
注意它绝对不应用于发布和用户使用环境,ASSERT就像盖房子时的绿罩子、绞手架,在施工期间,防止石块跌落,同时也有协助施工的作用。
JAVA源自C++,后者中被大力推广的ASSERT,在JAVA里应该有十分的存在理由。ASSERT更象是一种编程方法和习惯,而不应该受到语言的局限。
做为JAVA程序员,应该非常庆幸:C++的ASSERT几乎就真是一句“断言”,单凭它,你只能知道错了,而不知错在何处。要在实际项目中使用它,几乎都要用宏去重新定义,让它带有更多的调试信息,甚至是堆栈信息,做到这点还是需要些技巧的。而JAVA的ASSERT天生语法就可带有可读信息,并且自动抛出异常,我们可以方便看到堆栈。
有的文章攻击ASSERT(点这里),是混淆了其使用目的的结果。
现在的IDE及WEB调试环境都可以方便的控制VM参数,虽然JAVA可以选择在发布版本也使用ASSERT,但JAVA本身也和C++一样遵循默认不开启它。你只需要在调试和测试的时候加上-ea(enable assertion)即可。
UNIT TEST并不能替代ASSERT。ASSERT是在真真正正实在的运行中产生作用,不同于单元测试中的MOCK框架或者函数级别的“验证”测试。它着重于在整个系统运行时就将错误揪出来,试问单元测试能做到模拟整套系统运行吗?
总之,ASSERT是前人多年编程过程中积累的工具和经验,我们应该多用它。以几条摘自《高质量C/C++编程指南》使用规则结束本文:
【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。
【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
posted on 2008-05-30 11:54
我爱佳娃 阅读(2072)
评论(3) 编辑 收藏 所属分类:
JAVA基础