断言是用来检测不变式(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;列表大小大操作前必须为非负.后置条件为:移除一个元素后大小应减一,除非该元素不在列表中.
posted on 2009-08-22 11:52  萱萱草  阅读(404)  评论(0编辑  收藏  举报