断言 assert

willowflx 2008-09-13 11:05:31
断言是用来检测不变式(invariant)是不是为true的情况,如果发现断言为false,就会抛出异常.如果在代码中设置某一事物为ture,添加一个测试他的断言,就可以在程序的错误发生了奇怪的结果后捕获他们.抛出AssertionError.如:
public void append(Object value){
ListNode node =new ListNode(value);
if (tail !=null)
tail.next=node;
tail=node;
assert tail.next==null;
}
当append方法结束后,assert再次进行检查了最后一个节点构成的正确性.如果该节点的构成不正确,则会抛出一个AssertionError.

注:默认情况下,断言是不会被计算的,如:
assert ++i<max;
当断言被计算时,i的值将递增到下一个值.当断言关闭时,整个表达式在逻辑上将从代码消失,i的值永远不会改变,断言根本不会被计算.
当改为:i++;
assert i<max;

什么时候使用断言?
1.状态断言
eg1: //测试当前的状态是否具有它应具有的状态
public void setEnds(Point p1,Point p2){
this.p1=p1;
this.p2=p2;
distance = calculateDistance(p1,p2);
assert(distance>=0):"Negative distance";
}
距离的计算总的结果总应该是正值,如果出现负值时变会出现奇怪的结果,,而断言在起源处捕获这个bug,一确保状态和算法的正确性.
eg2: 术语前置条件和后置条件
public boolean remove(Object value){
assert count >=0;
throw new NullpointException("value");
int orig =count;
boolean foundIt=false;
try{
return foundIt;
}finally{
assert((!foundIt && count==orig)||count==orig-1;)
}
}
前置条件为count>=0;列表大小大操作前必须为非负.后置条件为:移除一个元素后大小应减一,除非该元素不在列表中.

...全文
133 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
getter 2008-09-14
  • 打赏
  • 举报
回复
呵呵,學習!
willowflx 2008-09-14
  • 打赏
  • 举报
回复
我觉得把学习的总结和心得发出来也很不错啊
akunamotata 2008-09-13
  • 打赏
  • 举报
回复
很不错...
3x3只眼 2008-09-13
  • 打赏
  • 举报
回复
踩下~~~
gesanri 2008-09-13
  • 打赏
  • 举报
回复
收下,还以为要问问题

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧