




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编程断言概述编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设可以将 断言看作是异常处理的一种高级形式断言表示为一些布尔表达式,程序员相信在程序 中的某个特定点该表达式值为真可以在任何时候启用和禁用断言验证,因此可以在测 试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时 可以重新起用断言。使用断言可以创建更稳定,品质更好且易于除错的代码当需要在一个值为false时 中断当前操作的话,可以使用断言单元测试必须使用断言(junit/junitx)除了类型检查和单元测试外,断言还提供了一种确定个种特性是否在程序中得到维护 的极好的方法使用断言使我们向按契约
2、式设计更近了一步常见的断言特性前置条件断言:代码执行之前必须具备的特性后置条件断言:代码执行之后必须具备的特性前后不变断言:代码执行前后不能变化的特性断言使用方式断言可以有两种形式lassertexpressionl2assertexpression 1:expression?其中expression!应该总是一个布尔值,expression?是断言失败时输出的失败消息的 字符串。如果expression!为假,则抛出一个assertionerror,这是一个错误,而不是 个异常,也就是说是一个不可控制异常(uncheckedexception),asseilioneitor由于 是错误,所以
3、可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。 启用断言断言在默认情况下是关闭的,要在编译时启用断言,需要使用source 14标记既 javacsource 14testjava,在运行时启用断占需要使用ea参数。要在系统类中启用和禁用 断言可以使用esa和dsa参数。例如:publicclassassertexampleonepublicassertexampleone() publicstaticvoidmain(stringargs) intx=10;systemoutprintln(mtestingassertionthatx= 100”); assertx=100
4、: houtassertionfailed!h;systemoutprintln(mtestpassed!n);如果编译时未加-sourcel4,则编译通不过 在执行时未加ea时输出为testing assertionthatx= 100testpassed jre忽略了断言的旧代码,而使用了该参数就会输出为testing assertionthatx= 100exceptioninthreadumain, javalang assertionerror:outassertionfailed! atassertexampleonemain(assertexampleonejava:6)断言的副
5、作用由于程序员的问题,断言的使用可能会带来副作用,例如:boolea nisenable 二 false;/ assertisenable=true;这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果 不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特 性,根据它來测试断言是否打开。publicclassassertexampletwof publicstaticvoidmain(stringargs) booleanisenab!e=false;/ assertisenable=true;if(isenable=false) thrownewr
6、untimeexception(hassertionshoulebee nable);何时需要使用断言1可以在预计正常情况下程序不会到达的地方放置断言:assertfalse2断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接 口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)3使用断言测试方法执行的前置条件和后置条件4使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age 属性应大于0小于某个合适值)什么地方不要使用断言断言语句不是永远会执行,可以屏蔽也可以启用因此:1不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行2断言语
7、句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返冋 值下边是介绍断言的用法:assert是在j2se14中引入的新特性,assertion就是在代码中包括的布尔型状态,程序 员认为这个状态是trueo 一般來说assert在开发的时候是检查程序的安全性的,在发 布的时候通常都不使用asserto在14中添加了 assert关键字和javalangasserterror类 的支持。首先,我们有必要从一个例子说起assertpublicclassasserttestpublicstaticvoidmain(stringlargs)asserttestat=newasserttest
8、();atassertme(true);atassertme(false);privatevoidassertme(booleanboo)assertboo?true: false;systemoutprintln(mtruec on dition");程序中包含了 assert的话,你要用javac-sourcel4xxxjava m编译,否则编译器会报错 的。要想让assert得部分运行的话,要使用java-eaxxx來运行,否则包含assert得行 会被忽略。下面我们运行javac-source 14asserttesljavajava-eaasserttest看看结果的输出是
9、:trueconditionexceptioninthread "main* javalang assertionerroratasserttestassertme(asserttestjava: 13)atasserttestmai n(asserttestjava:7)当我们运行atassertme(true)得时候,由于assertboo?true:false相当于asserttrue;因此没 有任何问题,程序往下执行打印出truecondition,但是执行atassertme(false)的时候相 当于assertfalse,这个时候解释器就会抛出assertionerro
10、r t »程序就终止了。大家必 须清楚assertionerror it继承自error得,因此你可以不再程序屮catch它的,当然你 也可以在程序+ catch它然后程序可以继续执行。例如:publicclass asserttestpublicstaticvoidmain(stringargs)asserttestat=newasserttest();tryatassertme(true);atassertme(false);catch(assertionerrorae)systemoutprintln(masserionterrorcatched");systemou
11、tprintln("goon");privatevoidassertme(booleanboo)assertboo?true:false;systemoutprintln("truec on dition");assert还有另外一种表达的方式,就是assertexpl:exp2;其中expl是个boolean返回值 得表达式,而exp2可以是原始的数据类型或者对象都可以例如:booleanboo=true;stringstr=null;assertboo=false: str="error"我们刚开始讲得assertexpl得形式,
12、当expl是false得时候,assertionerror得默认构 造器会被调用,但是assertexpl :exp2这样的形式,当expl为true的时候后而exp2被 或略,如果false的话,后面的表达式的结果会被计算出来并作为assertionerror得构 造器参数。看下而的例子:publicclass asserttestpublicstaticvoidmain(stringargs)asserttestat=newasserttest();atassertme(true);atassertme(false);privatevoidassertme(booleanboo)strin
13、gs 二 null;assertboo?true:false:s=hhelloworldk;systemoutprintln(mtruec on ditionn);运行的时候会得到这样的结果trueconditionexception inthreadm main* javalang assertionerror: helloworld atasserttestassertme(asserttestjava: 14)atasserttestmain(asserttestjava:7)assert最好不要滥用,原因是assert并不一定都是enable的,下面两种情况就不应该 用 assert不要再public的方法里面检查参数是不是为null之类的操作例如 publicintget(strings)asserts!=null;如果需要检查也最好通过ifs=null抛出nullpointerexception来检查不要用assert检查方法操作的返回值來判断方法操作的结果例如assertiistremoveall();这样看起来好像没有问题但是想想如果assert被disable呢, 那样他就不会被执行了所以removeallo操作就没有被执行可以这样代替 booleanboo=listremoveal();assertboo;就说这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老干部健康知识培训课件
- 热点10 突变和基因重组-高考生物专练(新高考专用)
- 2023年1月国开电大法学本科《国际法》期末纸质考试试题及答案
- 老人血栓保健知识培训课件
- 《高速卷绕头》征求意见稿编制说明
- 配电知识现场培训课件
- 2025版金融服务行业流动资金贷款合同
- 配电相关专业知识培训课件
- 2025年危险品运输安全培训承包合作协议
- 2025版智能化国内货物公路运输服务合同规范
- 马克思主义政治经济学第7章剩余价值的分配
- 成品出货检验报告模板
- 2023年中考语文一轮复习:语段综合专项练习题汇编(含答案)
- 香豆素抗凝血药华法林及其类似物的合成
- 长江上游黄河上中游地区天然林资源保护工程实施方案
- GB/T 5453-1997纺织品织物透气性的测定
- GB/T 14315-2008电力电缆导体用压接型铜、铝接线端子和连接管
- 农民工工资表(模板)
- 《室内空间设计》第三章课件
- 学习《北方民族大学学生违纪处分规定(修订)》课件
- 装配式建筑设计专篇(word6)
评论
0/150
提交评论