java assert的用法

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;

相關文章
相關標籤/搜索