`
yuan_xulong
  • 浏览: 88194 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java assert用法(转)

    博客分类:
  • Java
阅读更多

J2SE 1.4在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在Java语言方面最大的革新。在软件开发中,assertion是一种经典的调试、测试方式。

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身、有的是通过库函数等。另外,从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。

 

在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。下面简单介绍一下Java中assertion的实现。

 

1.1) 语法表示

 

在语法上,为了支持assertion,Java增加了一个关键字assert。它包括两种表达式,分别如下:

 

assert expression1;

assert expression1: expression2;

在两种表达式中,expression1表示一个boolean表达式,expression2表示一个基本类型或者是一个对象(Object) ,基本类型包括boolean,char,double,float,int和long。由于所有类都为Object的子类,因此这个参数可以用于所有对象。

 

1、assert

如果 为true,则程序继续执行。

如果为false,则程序抛出AssertionError,并终止执行。

 

2、assert : <错误信息表达式>

如果 为true,则程序继续执行。

如果为false,则程序抛出java.lang.AssertionError,并输出<错误信息表达式>。

 

1.2) 语义含义

 

在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象;如果expression1值为true,expression2将不被计算。

 

一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。

 

1.3) 一些assertion例子

 

下面是一些Assert的例子。

 

assert  0 < value;

assert  0 < value:"value="+value;

assert  ref != null:"ref doesn''t equal null";

assert  isBalanced();

 

1.4) 编译

 

由于assert是一个新关键字,使用老版本的JDK是无法编译带有assert的源程序。因此,我们必须使用JDK1.4(或者更新)的Java编译器,在使用Javac命令时,我们必须加上-source 1.4作为参数。-source 1.4表示使用JDK 1.4版本的方式来编译源代码,否则编译就不能通过,因为缺省的Javac编译器使用JDK1.3的语法规则。

 

一个简单的例子如下:

 

javac -source 1.4 test.java

 

1.5) 运行

 

由于带有assert语句的程序运行时,使用了新的ClassLoader和Class类,因此,这种程序必须在JDK1.4(或者更高版本)的JRE下运行,而不能在老版本的JRE下运行。

 

由于我们可以选择开启assertion功能,或者不开启,另外我们还可以开启一部分类或包的assertion功能,所以运行选项变得有些复杂。通过这些选项,我们可以过滤所有我们不关心的类,只选择我们关心的类或包来观察。下面介绍两类参数:

 

参数 -esa和 -dsa:

它们含义为开启(关闭)系统类的assertion功能。由于新版本的Java的系统类中,也使了assertion语句,因此如果用户需要观察它们的运行情况,就需要打开系统类的assertion功能 ,我们可使用-esa参数打开,使用 -dsa参数关闭。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。

参数 -ea和 -ea:

它们含义为开启(关闭)用户类的assertion功能:通过这个参数,用户可以打开某些类或包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,表示打开这些类或包;如果包名称后面跟有三个点,代表这个包及其子包;如果只有三个点,代表无名包。关闭assertion功能参数为-da,使用方法与-ea类似。

-ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。

下面表格表示了参数及其含义,并有例子说明如何使用。

参数 例子 说明

-ea java -ea 打开所有用户类的assertion

-da java -da 关闭所有用户类的assertion

-ea: java -ea:MyClass1 打开MyClass1的assertion

-da: java -da: MyClass1 关闭MyClass1的assertion

-ea: java -ea:pkg1 打开pkg1包的assertion

-da: java -da:pkg1 关闭pkg1包的assertion

-ea:... java -ea:... 打开缺省包(无名包)的assertion

-da:... java -da:... 关闭缺省包(无名包)的assertion

-ea: ... java -ea:pkg1... 打开pkg1包和其子包的assertion

-da: ... java -da:pkg1... 关闭pkg1包和其子包的assertion

-esa java -esa 打开系统类的assertion

-dsa java -dsa 关闭系统类的assertion

分享到:
评论

相关推荐

    Java陷阱之assert关键字

     在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的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面试大合集

    Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。 Static Nested Class 和 Inner Class 的不同 Nested Class(一般是C++的说法),Inner Class(一般是JAVA的说法)。...

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

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

    java综合试题

    4. Java 中的关键字有 50 多个,包括 true、false、null、abstract、assert、break 等。 5. char 型变量可以存贮一个中文汉字,因为 Java 使用 Unicode 字符集,char 型变量可以存贮 Unicode 码点中的任何字符。 6. ...

    java编程常用英语单词解释

    了解这些单词的解释将有助于我们更好地理解和使用 Java 语言。下面是 Java 编程常用英语单词的解释: 1. Abstract(关键字):抽象的,指的是不能被实例化的类或接口。 2. Access(关键字):访问、存取,指的是...

    JAVA面试题最全集

    被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 ...

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

    8.1.5 关于assert 245 8.2 异常与资源管理 247 8.2.1 使用finally 247 8.2.2 自动尝试关闭资源 249 8.2.3 java.lang.autocloseable接口 251 8.3 重点复习 255 8.4 课后练习 256 chapter8 collection与...

    java测试用例JUnit教程

    Java 是一种广泛使用的编程语言,而 JUnit 是 Java 测试框架中最流行的测试框架之一。JUnit 提供了一组丰富的断言方法,帮助开发者编写可靠的测试用例,从而提高代码质量。本教程旨在指导读者学习使用 JUnit 创建...

    JAVA--达内培训笔记

    5、java源代码中的main方法的定义写法。main方法是程序的入口。 public class Hello{ //一个源文件中只能有一个公开类,而且源文件的文件名与公开类的类名完全一致 public static void main(String[] args){ //...

    Junit4使用方法

    JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。本文将详细介绍 JUnit4 的使用方法和核心概念。 JUnit4 核心概念 JUnit4 的核心概念包括测试类、测试集和测试运行...

    assert-text:在需要时断言多行文本

    用法 var assertText = require ( 'assert-text' ) ;assertText . equal ( 'what a wonderful\n' + 'idea for the\n' + 'module' , 'what a wonderful\n' + 'idea for a\n' + 'module' ) ; 上面的示例将抛出: Error...

    变态JAVA面试32问

    * Finalize 方法:Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。 2. Anonymous Inner Class(匿名内部类): * 不能 extends 其它类,但一个内部类可以作为一个...

    Java面试宝典-经典

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    Java面试宝典2010版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    java面试题大全(2012版)

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    java面试宝典

    java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 ...

    java面试题

    82. 异常的使用方法 98 83. JAVA代码查错 101 83.1. 判断 101 83.2. 判断 102 83.3. 判断 102 83.4. 判断 102 83.5. 判断 102 83.6. 判断 103 83.7. 判断 103 83.8. 判断 103 83.9. 判断 104 83.10. 判断 104 83.11....

Global site tag (gtag.js) - Google Analytics