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;