`

java中assert使用

    博客分类:
  • java
阅读更多

转自:http://jerrygao.iteye.com/blog/77544

assert是在J2SE1.4中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在1.4中添加了assert关键字和java.lang.AssertError类的支持。

      首先,我们有必要从一个例子说起assert

public class AssertTest
{
public static void main(String[] args)
{
  AssertTest at = new AssertTest();
  at.assertMe(true);
  at.assertMe(false);
  
}

private  void assertMe(boolean boo)
{
  assert boo?true:false;
  System.out.println("true condition");
}

}
程序中包含了assert的话,你要用javac -source 1.4 xxx.java来编译,否则编译器会报错的。要想让assert得部分运行的话,要使用java -ea xxx来运行,否则包含assert得行会被忽略。下面我们运行
javac -source 1.4 AssertTest.java
java -ea AssertTest
看看结果的输出是:
true condition
Exception in thread "main" java.lang.AssertionError
        at AssertTest.assertMe(AssertTest.java:13)
        at AssertTest.main(AssertTest.java:7)
当我们运行at.assertMe(true)得时候,由于assert boo?true:false相当于 assert true;因此没有任何问题,程序往下执行打印出true condition,但是执行at.assertMe(false)的时候相当于assert false,这个时候解释器就会抛出AssertionError了,程序就终止了。大家必须清楚AssertionError是继承自Error得,因此你可以不再程序中catch它的,当然你也可以在程序中catch它然后程序可以继续执行。例如:
public class AssertTest
{
public static void main(String[] args)
{
  AssertTest at = new AssertTest();
  try
  {
   at.assertMe(true);
   at.assertMe(false);
  }
  catch(AssertionError ae)
  {
   System.out.println("AsseriontError catched");
  }
  System.out.println("go on");
  
}

private  void assertMe(boolean boo)
{
  assert boo?true:false;
  System.out.println("true condition");
}

}

      assert还有另外一种表达的方式,就是assert exp1:exp2;其中exp1是个boolean返回值得表达式,而exp2可以是原始的数据类型或者对象都可以例如:
   boolean boo = true;
   String str = null;
    assert boo = false:str="error";A

     我们刚开始讲assert exp1的形式,当exp1是false的时候,AssertionError的默认构造器会被调用,但是assert exp1:exp2这样的形式,当exp1为true的时候后面exp2被或略,如果false的话,后面的表达式的结果会被计算出来并作为AssertionError得构造器参数。看下面的例子:
public class AssertTest
{
public static void main(String[] args)
{
  AssertTest at = new AssertTest();
  at.assertMe(true);
  at.assertMe(false);
  
}

private  void assertMe(boolean boo)
{
  String s = null;
  assert boo?true:false:s = "hello world";
  System.out.println("true condition");
}

}运行的时候会得到这样的结果
true condition
Exception in thread "main" java.lang.AssertionError: hello world
        at AssertTest.assertMe(AssertTest.java:14)
        at AssertTest.main(AssertTest.java:7)
Assert最好不要滥用,原因是assert并不一定都是enable的,下面两种情况就不应该用assert
不要再public的方法里面检查参数是不是为null之类的操作
例如public int get(String s)
   {
       assert s != null;
   }
如果需要检查也最好通过if s = null 抛出NullPointerException来检查 不要用assert来检查方法操作的返回值来判断方法操作的结果  
例如 assert list.removeAll();这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了 所以removeAll()操作就没有被执行  可以这样代替
boolean boo = list.removeAl();
assert boo;
分享到:
评论

相关推荐

    Assert.java

    适用于Java大部分非空判断,有效的减少空指针问题,直接调用Assert 里面的方法就行,非常方便,你值得拥有

    Java陷阱之assert关键字

     在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言...

    Java断言(assert)

    可以为Java复杂的测试提供简单的方法!可以加快开发进度

    Java关键词assert的使用(基于IntelliJ IDEA)

    正确算法 private static int pythagorean(int x, int y) { return x * x + y * y; } 错误算法 private static int pythagorean(int x, int y) { return x * x + y * y +...assert想在IDE中使用,就必须开虚拟机选项

    Java陷阱之assert关键字详解

    详细介绍了Java陷阱之assert关键字,有需要的朋友可以参考一下

    业务异常提示处理 springboot+Assert(自定义断言)

    使用springboot框架快速搭建,封装自定义断言做业务校验,公共异常处理打印日志, 更简单的业务判断处理

    java、android解压缩Assert文件夹下的压缩文件

    通过调用UnzipUtils下面的UnzipUtils.createFile(locationZip);UnzipUtils.copyBigDataToSD(MainActivity.this, locationZip, ZIP_NAME);UnzipUtils.upZipFile(new File(locationZip)...

    java异常处理机制示例(java抛出异常、捕获、断言)

    主要介绍了java异常处理机制示例(java抛出异常、捕获、断言),需要的朋友可以参考下

    A Java architecture test library, to specify and assert ar.zip

    A Java architecture test library, to specify and assert ar.zip

    动态编译字符串成java,并且添加class到jvm

    动态编译字符串成java,并且添加class到jvm

    Java项目开发常用工具包util

    Java项目开发常用工具包,其中主要包括:Assert.java BufferedImageLuminanceSource.java CipherUtil.java ClientConst.java CodeUtil.java ComputeUtil.java DataUtils.java DateUtils.java Digests.java Encodes....

    JAVA--达内培训笔记

    goto和const在java中虽然不再使用但是还作为保留字存在 java中没有sizeof这个关键字了,java中的boolean类型的值只能用true和false,且这两个也是关键字 enum 枚举 assert 断言 一个标识符尽量符合语义信息,...

    junit-assert-collector:Java库扩展了JUnit的ErrorCollector类,提供了典型的JUnit样式声明方法

    junit-assert-collector 我编写的Java库是为了补充我在Savvis / CenturyLink最初开发的测试框架而开发的测试框架。 该库实质上扩展了JUnit库的org.junit.rules.ErrorCollector类,并且提供了大多数(如果不是全部)...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 ...

    java2参考大全 中文

    本书由世界级编程大师Herbert Schildt撰写,英文原书一经出版,就受到了读者的热烈欢迎。...书中包含了Java 2, 版本1.3中新增的特征,其中最重要的是assert关键字、基于通道的I/O子系统、成链的异常和网络增强功能等。

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

    java 常用英语词汇大全

    java 常用英语词汇大全 部分内容如下: algorithm n.算法['.lg.riem] annotation [java]代码注释[.n.u'tei..n] anonymous adj....(反义:directly adv....assert (关键字) 断言[.'s.:t] ‘ (java 1.4 之后成为关键字

    java 面试题 总结

    子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。...

    java面试宝典

    156、在jsp:useBean语法中使用beanName有何好处? 37 157、当我使用时,在浏览器的地址栏没有改变? 37 158、如何转换JSP 0.9版本的文件到JSP1.1? 37 160、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么...

Global site tag (gtag.js) - Google Analytics