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;