[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,如下:
四、其它選項:
    當執行代碼時,使用-ea選項使斷言有效,也可以使用-da選項使斷言無效(默認爲無效)同樣,也可以通過在-ea或-da後面指定包名來使一個包的斷言有效或無效。例如,要使一個com.test包中的斷言無效,可以使用:
-da:com.test
要使一個包中的所有子包中的斷言能夠有效或無效,在包名後加上三個點。例如:
-ea:com.test...
即可使com.test包及其子包中的斷言無效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章