首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 预言整理

2012-10-24 
Java 断言整理 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 断言表示为一些布尔

Java 断言整理
    编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。 使用断言可以创建更稳定,品质更好且易于除错的代码 当需要在一个值为FALSE时中断当前操作的话,可以使用断言,单元测试必须使用断言(Junit/JunitX) ,除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法, 使用断言使我们向按契约式设计更近了一步。

常见的断言特性

前置条件断言:代码执行之前必须具备的特性  
后置条件断言:代码执行之后必须具备的特性  
前后不变断言:代码执行前后不能变化的特性

断言使用方式

断言可以有两种形式  
public class AssertExampleOne{  public AssertExampleOne(){}   public static void main(String args[]){   int x=10;   System.out.println("Testing Assertion that x==100");   assert x=100:"Out assertion failed!";   System.out.println("Test passed!");  } } 
 如果编译时未加 -source1.4,则编译通不过
 在执行时未加 -ea 时输出为
   Out assertion failed!
  at AssertExampleOne.main(AssertExampleOne.java:6)

断言的副作用

  由于程序员的问题,断言的使用可能会带来副作用 ,例如:
  

        boolean isEnable=false;//...  assert isEnable=true;

这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。
 
        public class AssertExampleTwo{  public static void main(String args[]){  boolean isEnable=false;  //...          assert isEnable=true;      if(isEnable==false){    throw new RuntimeException("Assertion shoule be enable!");      }  } } 


何时需要使用断言

assert list.removeAll();
这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了 所以removeAll()操作就没有被执行
可以这样代替
 
 boolean boo = list.removeAl();  assert boo; 


下面是我的测试代码:

      public class AssertTest{             public static void main(String[] args){      AssertTest at = new AssertTest();      try {    at.assertMe(true);    at.assertMe(false);      } catch (AssertionError e) { e.printStackTrace();     System.out.println("断言为假!!!");      }    System.out.println("go on !!!!");            }           private  void assertMe(boolean boo){ int s = 0; assert boo:++s;   //当boo 为真时,assert语句将被忽略,对应的++s 也不会执行,当boo为假时,assert中的第二个参数表达式将会被执行,并且将结果作为构造AssertError的参数,并且抛出AssertError错误 System.out.println(boo+"  condition   "+s);     } }

热点排行