assert 是在 J2SE1.4 中引入的新特性, assertion 就是在代码中包括的布尔型状态,程序员认为这个状态是 true 。通常来讲 assert 在开发的时候是检查程序的安全性的,在发布的时候一般都不使用 assert 。在 1.4 中添加了 assert 关键字和 java.lang.AssertError 类的支持。 java
首先,咱们有必要从一个例子提及 assert 程序员
public class AssertTest 安全
{ ide
public static void main(String[] args) post
{ spa
AssertTest at = new AssertTest(); orm
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;