天天看點

JAVA assert(斷言)

一、文法形式:

    Java2在1.4中新增了一個關鍵字:assert。在程式開發過程中使用它建立一個斷言(assertion),它的

文法形式有如下所示的兩種形式:

1、assert condition;

    這裡condition是一個必須為真(true)的表達式。如果表達式的結果為true,那麼斷言為真,并且無任何行動

如果表達式為false,則斷言失敗,則會抛出一個AssertionError對象。這個AssertionError繼承于Error對象,

而Error繼承于Throwable,Error是和Exception并列的一個錯誤對象,通常用于表達系統級運作錯誤。

2、asser condition:expr;

    這裡condition是和上面一樣的,這個冒号後跟的是一個表達式,通常用于斷言失敗後的提示資訊,說白了,它是一個傳到AssertionError構造函數的值,如果斷言失敗,該值被轉化為它對應的字元串,并顯示出來。

二、使用示例:

    下面是一個使用assert的例子:

public class TestAssert{
      public static void main(String[] args){
          String chai";
          //String assert(name!=null):"變量name為空null";
          System.out.println(name);
      }
 }      

    上面程式中,當變量name為null時,将會抛出一個AssertionError,并輸出錯誤資訊。

要想讓上面的程式中的斷言有效并且正确編譯,在編譯程式時,必須使用-source 1.4選項。如:

javac -source 1.4 TestAssert.​Java​

在Eclipse(3.0M9)開發環境中,必須在window->preferences 中,左邊選中"Java->Compiler",右邊選擇

“Compliance and ClassFiles”頁面下的将"Compiler Compliance Level"選擇為1.4;同時,将

"Use Default Compiler Settings"前的勾去掉。并将下面的

"Generated .class file compatibility"和"Sourcecompatibility"均選擇為1.4,才能正确編譯。

同時,要想讓斷言起效用,即讓斷言語句在運作時确實檢查,在運作含有assert的程式時,必須指定-ea選項

如:為了能夠讓上面的程式運作,我們執行下面代碼:

java -ea TestAssert

在在Eclipse(3.0M9)開發環境中,運作時,我們必須配置運作時的選項"Run",在Arguments頁面中的

"VM Arguments" 中填入-ea選項。才能讓斷言在運作時起作用。

三、注意事項:

    了解斷言最重要的一點是必須不依賴它們完成任何程式實際所需的行為。理由是正常釋出的代碼都是斷言無效的,即正常釋出的代碼中斷言語句都不不執行的(或不起作用的),如果一不小心,我們可以錯誤地使用斷言,如:

public class TestPerson{
     private String TestPerson(String name){
         this.name = name;
     }
     public void setName(String nameStr){
         this.name = nameStr;
     }
     public String getName(){
          return this.name;
     }
     public static void main(String[] args){
         TestPerson personObj = newTestPerson("Abner Chai");
         String personName = null;
         assert(personName=personObj.getName())!=null;
         System.out.println(personName.length());
     }
 }      

這個程式中,對personName的指派被轉移到assert6語句中,盡管斷言有效時它可以很好地運作(即使用-ea運作

時可以有效地運作)但如果斷言失效,則它會運作時報空指針錯誤。因為斷言無效時,

personName=personObj.getName()一句永遠不會執行!

    斷言對Java來說是一個好的條件,因為它們使開發過程中錯誤類型檢查流線化,例如,在沒有assert之前,

上面的程式要想确認personName 不空,則必須:

if(personName!=null){
     System.out.println(personName.length());
 }      

才行。有了assert後,使用assert,隻需一行代碼,并且不必從釋出的代碼中删除assert語句。

于是,上面的那個程式,經改正後,我們可以這麼樣來正确的使用assert,如下:

public class TestPerson{
     private String TestPerson(String name){
         this.name = name;
     }
     public void setName(String nameStr){
         this.name = nameStr;
     }
     public String getName(){
          return this.name;
     }
     public static void main(String[] args){
         TestPerson personObj = newTestPerson("Abner Chai");
         String personName = null;
         personName=personObj.getName();
         assert personName!=null;
         System.out.println(personName.length());
     }
 }