首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 第二书店 程序员
您的位置:Java->被程序员和测试员遗忘的好朋友--ASSERT

被程序员和测试员遗忘的好朋友--ASSERT2008-05-31 来自:villa123  [收藏到我的网摘]

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】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

推荐人评论

ASSERT是在调试与测试环境,让程序员和测试者及时发现运行时错误的极简极佳之方法。

用户评论

正在载入评论列表...

是谁推荐了此篇文章

专家头像
个人blog发送信息
推荐的其他文章

热点新闻

热点评论

    精彩视频

    精彩专题

    资源下载

    网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|版权声明|问题报告

    北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号

    世纪乐知(北京)网络技术有限公司 提供技术支持

    Copyright ? 2000-2008, CSDN.NET, All Rights Reserved

    GongshangLogo