断言
1.断言的概念
若确信某个属性符合要求,并且代码的执行依赖于这个属性。比如:需要计算 double y=Math.sqrt(x);
上述可以确信的是x是一个非负数值。但是还是希望进行检查,以避免让“不是一个数”的数值参与计算操作。在这里可以抛出异常来处理这个问题,但是异常处理的代码在测试完毕之后不会自动删除,如果代码中含有大量的这种检查,程序运行起来也会很慢。
断言机制就是允许在测试期间向代码中插入一些检查语句,。当代码发布时,这些插入的检测语句将会被自动移走(注意和异常检查的不同)。
Java语言引入了关键字assert,两种形式:
①assert 条件;
②assert 条件:表达式;
上述两种形式都会对条件进行检测,如果结果为false,则会抛出一个AssertionError异常。在第二种形式中,表达式将被传入AssertionError的构造器,并转换成一个消息字符串。
要想断言x是一个非负数值,只需要简单的使用语句: assert x>=0; 或者将x的实际值传递给AssertionError对象,从而可以在后面显示出来 assert x>=0:x;
注意:在Java中,条件并不会自动的成为错误报告中的一部分。如果希望看到这个条件,就必须将它以字符串的形式传递给AssertionError对象:assert x>=0:“x>=0”。
2.启用和禁用断言
默认情况下,断言被禁用。
①可以在运行程序时用-enableassertions或者-ea选项启用:java -enableassertions MyApp
注意:在启用或者禁用断言时不必重新编译程序。启用或禁用断言是类加载器的功能。当断言被禁用时,类加载器将跳过断言代码,因此,不会降低程序的运行速度。
也可以在某个类或者整个包中使用断言,如:
java -ea:MyClass -ea:com.mycompany.mylib… MyApp这条命令将开启MyClass类以及在com.mycompany.mylib包和它的子包中的所有类的断言。选项-ea将开启默认包中所有类的断言
②可以用选项-disableassertions或-da禁用某个特定类和包的断言:java -da:MyClass MyApp
有些类不是由类加载器加载的,而是直接由虚拟机加载。可以使用这些开关有选择的启用或者禁用那些类中的断言。但是启用或者禁用所有断言的-ea和-da开关不能应用到那些没有类加载器的“系统类”上,对于这些系统来说,需要使用-enablesystemassertions/-esa开关启用断言
3.使用断言完成参数检查
在Java语言中,给出了3种处理系统错误的机制:
抛出一个异常;日志; 使用断言
那么什么时候应该使用选择断言呢?
1.断言失败是致命的,不可恢复的错误
2.断言检查只用于开发和测试阶段
因此不应该使用断言向程序的其他部分通告发生了可恢复性的错误,或者,不应该作为程序向用户通告问题的手段。断言只应该用于在测试阶段确定程序内部的错误位置
4.为文档假设使用断言
例子:
if(i%3 == 0)
…
else if(i%3 == 1)
…
else // (i%3 == 2)
…
上述代码例子使用断言会更好一些
if(i %3 == 0)
…
else if(i%3 == 1)
…
else
{
assert i%3 == 2;
…
}
使用断言来进行自我检查,上述代码中 i%3 ,如果i是正值,那么余数肯定是0,1,2。如果i是负值,则余数则可以是-1,-2。但是实际上都认为i是非负数,因此,最好在if语句之前使用下列断言: assert i >=0;
IDEA中如何开启断言
1.
2.将选项中的内容修改为-enableassertions或者-ea,确认。即启用断言