问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

eclipse assert怎么用

发布网友 发布时间:2023-05-09 23:06

我来回答

1个回答

热心网友 时间:2024-12-12 11:25

一、assertion的意义和用法

J2SE 1.4在语言上提供了一个新特性,就是assertion功能,它是该版本在Java语言方面最大的革新。

从理论上来说,通过 assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。

在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。

一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

1、语法表示

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

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

2、含义

在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。

如果assertion语句包括expression2参数,程序将计算出 expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对 象;如果expression1值为true,expression2将不被计算。

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

3、编译

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

大家在使用eclipse,jbuilder等IDE工具的时候,要注意编译器的版本,使用的jre,不等于是javac 的版本

一个简单的例子如下:javac -source 1.4 AssertTest.java

4、运行

由于我们可以选择开启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 -dsa:MyClass1:pkg1 关闭MyClass1和pkg1包的assertion

其中...代表,此包和其子包的含义。例如我们有两个包为pkg1和pkg1.subpkg。

那么pkg1...就代表pkg1和pkg1.subpkg两个包。

另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API。下面简单说明一下几个API的作用。

ClassLoader类中的几个相关的API:

setDefaultAssertionStatus:

用于开启/关闭assertion功能

  setPackageAssertionStatus:

用于开启/关闭某些包的assertion功能

  setClassAssertionStatus:

用于开启/关闭某些类的assertion功能

  clearAssertionStatus:

用于关闭assertion功能

二、assertion的设计问题

首先,我们认为assertion是必要的。因为,如果没有统一的assertion机制,Java程序通常使用if-then-else或者switch-case语句进行assertion检查,而且检查的数据类型也不完全相同。

assertion机制让Java程序员用统一的方式处理assertion问题, 而不是按自己的方式处理。另外,如果用户使用自己的方式进行检查,那么这些代码在发布以后仍然将起作用,这可能会影响程序的性能。而从语言言层次支持 assertion功能,这将把assertion对性能带来的负面影响降到最小。

Java是通过增强一个关键字assert实现支持assertion,而不是 使用一个库函数支持,这说明Java认为assertion对于语言本身来说是非常重要的。C语言就是 通过Assert.h函数库实现断言的支持。

Java的assertion的开启也和C语言不太一样,我们都知道在C语言中,assertion的开启是在编译时候决定的。当我们使用debug方式编译程序时候,assertion被开启,而使用release方式编译时候,assertion自动被关闭。

而Java的assertion却是在运行的时候进行决定的。其实,这两种方式是各有优缺点。如果采用编译时决定方式,开发人员将处理两种类型的目标码,debug版本和release版本,这加大了文档管理的难度,但是提高了代码的运行效率。

Java采用运行时决定的方式,这样所有的assertion信息将置于目标代码 中,同一目标代码可以选择不同方式运行,增强目标代码的灵活性,但是它将牺牲因为assertion而引起一部分性能损失。

另外,我们注意到AssertionError作为Error的一个子类,而不 是RuntimeException。Error代表一些异常的错误,通常是不可以恢复的,而 RuntimeException强调该错误在运行时才发生的特点。AssertionError通常为非常关键的错误,这些错误往往是不容易恢复的,而且assertion机制也不鼓励程序员对这种错误进行恢复。

三、assertion与继承

如果一个assert语句在父类,而当它的子类调用它时,该assert为false。父类的assert语句将只有在父类的assert开启才起作用,如果仅仅开启子类的assert,父类的assert仍然不运行。因此,assert语句不具有继承功能。

四、assertion的使用

assertion的使用是一个复杂的问题,通常来说,assertion用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响,并且这种错误不容易恢复的。

assertion表达式应该短小、易懂,如果需要评估复杂的表达式,应该使用函数计算。以下是一些使用assertion的情况的例子,这些方式可以让java程序的可靠性更高。

检查控制流; 在if-then-else和swith-case语句中,我们可以在不应该发生的控制支流上加上assert false语句。如果这种情况发生了,assert能够检查出来。

在私有函数计算前,检查输入参数是否有效;对于一私有些函数,要求输入满足一些特定的条件,那么我们可以在函数开始处使用assert进行参数检查。

对于公共函数,我们通常不使用assertion检查,因为一般来说,公共函数必须对无效的参数进行检查和处理。而私有函数往往是直接使用的。例如:某函数可能要求输入的参数必须不为null。那么我们可以在函数的一开始加上:

assert parameter1!=null : "paramerter is null in test method";

在函数计算后,检查函数结果是否有效;对于一些计算函数,函数运行完成后,某些值需要保证一定的性质,因此我们可以通过assert检查该值。例如,我们有一个计算绝对值的函数,那么我们就可以在函数的结果处,加上一个语句:

assert value>=0:"Value should be bigger than 0:"+value;

通过这种方式,我们可以对函数计算完的结果进行检查。检查程序不变量;有些程序中,存在一些不变量,在程序的运行生命周期,这些不变量的值都是不变的。这些不变量可能是一个简单表达式,也可能是一个复杂的表达式。

对于一些关键的不变量,我们可以通过assert进行检查。例如,在一个财会系统中,公司的支出和收入必须保持一定的平衡关系,因此我们可以编写一个表达式检查这种平衡关系,如下表示:

private boolean isBalance() { …… }

在这个系统中,在一些可能影响这种平衡关系的方法的前后,我们都可以加上assert验证:

assert isBalance():"balance is destoried";

五、补充

必须清楚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并不一定都是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;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我梦见一条蛇,谁能解梦? ...战地3港版,多人联网要求ea账号,于是用电脑注册了一个,用ps3登入提... 谁给推荐几个不花钱的好玩的游戏啊!无聊中... 天气潮汐预报app哪个好用 涨潮有什么软件 墨迹天气怎么看潮汐时间 墨迹天气潮汐预报设置教程 哪种天气预报能看潮汐 小米手机开发者模式在哪里关闭?小米手机开发者模式 上海行迈企业管理咨询有限公司讲师介绍 赵继红培训课程 西城女孩是什么意思 网名西城是什么意思? 杨戬的身世是什么? F(X) 崔雪莉的衣服是什么牌子啊,在哪里买?? 家庭结余的支配项目包括专项结余和自由结余两大类,其中专项结余包括... 家庭理财关注本月结余还是本年结余 IS PET DESIGNER PETWEAR注册过商标吗?还有哪些分类可以注册? 匹克 猛兽四代好还是速鹰二代好 说说各自的优缺点,谢了兄弟们 匹克tp9与速鹰二代哪双好 这是什么匹克篮球鞋? 想问问大家,谁买过匹克速鹰二代秋冬款篮球鞋。我想买一双。但是看到有... petdesigner添加的图片没有用 petdesigner为什么闪退 谁知道匹克速鹰二代如何?透不透气啊? 我有块翡翠玉知不道真假我朋友送的? ...上面还有一些黑色的纹路 ,不知道怎么鉴别真假 老师好 我有个翡翠吊坠是朋友几年前送的 有人说是真的 也有人说是假... 什么是假翡翠手镯 如何完成陌生人与怪胎的支线任务? 别人送的翡翠吊坠怎么看真假别人送的翡翠吊坠如何看真假 荷尔蒙丰胸镇怎么样安全吗 写人的正侧面描写作文150字 用正面描写和侧面描写相结合写作文 案吏的诗句案吏的诗句是什么 会计行政法规是指 会计法规就是指《会计法》,它是指导和规范会计工作的基本法。 怎样可以用手机号注册多个啊? 无限注册企业怎么弄 soccer英文 关于完善河南省中小学教师继续教育管理系统有关信息的通知 ...黑龙江省政府系统政务信息工作管理办法》的通知 曝梅西发声:巴托梅乌还在,我就走人!两大佬将在明天对话 【北京车展】对话大佬,创事纪第二弹即将来临! 哄小朋友的经典睡前童话故事大全 睡前童话故事大全哄小朋友(5篇) 哄小朋友睡前童话故事大全【五篇】 睡前故事大全哄小朋友(10篇) 哄小朋友的简短睡前童话小故事大全【四篇】 哄小朋友开心的睡前童话故事大全【四篇】 小学生写景作文600字:美丽的黑龙江