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;
我们刚开始讲得
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
1
不要再
public
的方法里面检查参数是不是为
null
之类的操作
例如
public int get(String s)
{
assert s != null;
}
如果需要检查也最好通过
if s = null
抛出
NullPointerException
来检查
2
不要用
assert
来检查方法操作的返回值来判断方法操作的结果
例如
assert list.removeAll();
这样看起来好像没有问题
但是想想如果
assert
被
disable
呢,那样他就不会被执行了
所以
removeAll()
操作就没有被执行
可以这样代替
boolean boo = list.removeAl();
assert boo;