java高级断言_Java之断言
轉自博客:http://blog.csdn.net/tanga842428/article/details/52463694
一、語法形式
Java在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)開發環境中,有2種開啟斷言的設置方式:
(1) Run -> Run Configurations -> Arguments頁簽 -> VM arguments文本框中加上斷言開啟的標志:-enableassertions 或者-ea
(2) 在myEclipse中,Windows -> Preferences ->Java ->Installed JREs ->點擊正使用的JDK ->Edit ->Default VM Arguments文本框中輸入:-ea
三、注意事項
理解斷言最重要的一點是必須不依賴它們完成任何程序實際所需的行為。理由是正常發布的代碼都是斷言無效的,即正常發布的代碼中斷言語句都不執行的(或不起作用的),如果一不小心,我們可以錯誤地使用斷言,如:
public?class?TestPerson{
private?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?=?new?TestPerson("Abner?Chai");
String?personName?=?null;
assert(personName=personObj.getName())?!=?null;
System.out.println(personName.length());
}
}
這個程序中,對personName的賦值被轉移到assert語句中,盡管斷言有效時它可以很好地運行(即使用-ea運行時可以有效地運行)但如果斷言失效,則它會運行時報空指針錯誤。因為斷言無效時,personName=personObj.getName()一句永遠不會執行!
斷言對Java來說是一個好的條件,因為它們使開發過程中錯誤類型檢查流線化,例如,在沒有assert之前,上面的程序要想確認personName 不空,則必須:
if(personName!=null){
System.out.println(personName.length());
}
才行。有了assert后,使用assert,只需一行代碼,并且不必從發布的代碼中刪除assert語句。于是,上面的那個程序,經改正后,我們可以這么樣來正確的使用assert,如下:
public?class?TestPerson{
private?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());
}
}
四、其它選項
當執行代碼時,使用-ea選項使斷言有效,也可以使用-da選項使斷言無效(默認為無效)。同樣,也可以通過在-ea或-da后面指定包名來使一個包的斷言有效或無效。例如,要使一個com.test包中的斷言無效,可以使用:
-da:com.test
要使一個包中的所有子包中的斷言能夠有效或無效,在包名后加上三個點。例如:
-da:com.test...
即可使com.test包及其子包中的斷言無效。
總結
以上是生活随笔為你收集整理的java高级断言_Java之断言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去四眼楼坐几路车?
- 下一篇: 江淮骏铃v6老是脱档是什么原因?