斷言概述
編寫代碼時,我們總是會做出一些假設(shè)莫瞬,斷言就是用于在代碼中捕捉這些假設(shè)
可以將斷言看作是異常處理的一種高級形式
斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真
可以在任何時候啟用和禁用斷言驗證茴厉,因此可以在測試時啟用斷言而在部署時禁用斷言凌净。同樣,程序投入運行后斧吐,最終用戶在遇到問題時可以重新起用斷言又固。
使用斷言可以創(chuàng)建更穩(wěn)定,品質(zhì)更好且易于除錯的代碼
當需要在一個值為FALSE時中斷當前操作的話煤率,可以使用斷言
單元測試必須使用斷言(Junit/JunitX)
除了類型檢查和單元測試外仰冠,斷言還提供了一種確定個種特性是否在程序中得到維護的極好的方法
使用斷言使我們向按契約式設(shè)計更近了一部
常見的斷言特性
前置條件斷言:代碼執(zhí)行之前必須具備的特性
后置條件斷言:代碼執(zhí)行之后必須具備的特性
前后不變斷言:代碼執(zhí)行前后不能變化的特性
斷言使用方式
斷言可以有兩種形式
1.assert Expression1
2.assert Expression1:Expression2
其中Expression1應(yīng)該總是一個布爾值,Expression2是斷言失敗時輸出的失敗消息的字符串蝶糯。如果Expression1為假洋只,則拋出一個 AssertionError,這是一個錯誤昼捍,而不是一個異常识虚,也就是說是一個不可控制異常(unchecked Exception),AssertionError由于是錯誤,所以可以不捕獲妒茬,但不推薦這樣做担锤,因為那樣會使你的系統(tǒng)進入不穩(wěn)定狀態(tài)。
起用斷言
斷言在默認情況下是關(guān)閉的乍钻,要在編譯時啟用斷言肛循,需要使用source1.4標記 既javac source1.4 Test.java ,在運行時啟用斷言需要使用 -ea參數(shù) 铭腕。要在系統(tǒng)類中啟用和禁用斷言可以使用 -esa 和 -dsa參數(shù)。
例如:
public class AssertExampleOne{
public AssertExampleOne(){}
public static void main(String args[]){
int x=10;
System.out.println("Testing Assertion that x==100");
assert x==100:"Out assertion failed!";
System.out.println("Test passed!");
}
}
如果編譯時未加 -source1.4,則編譯通不過
在執(zhí)行時未加 -ea 時輸出為
Testing Assertion that x==100
Test passed
jre忽略了斷言的就代碼多糠,而使用了該參數(shù)就會輸出為
Testing Assertion that x==100
Exception in thread "main" java.lang.AssertionError: Out assertion failed!
at AssertExampleOne.main(AssertExampleOne.java:6)
斷言的副作用
由于程序員的問題累舷,斷言的使用可能會帶來副作用 ,例如:
boolean isEnable=false;
//...
assert isEnable=true;
這個斷言的副作用是因為它修改了程序中變量的值并且未拋出錯誤熬丧,這樣的錯誤如果不細心的檢查是很難發(fā)現(xiàn)的笋粟。但是同時我們可以根據(jù)以上的副作用得到一個有用的特性,根據(jù)它來測試斷言是否打開析蝴。
public class AssertExampleTwo{
public static void main(String args[]){
boolean isEnable=false;
//...
assert isEnable=true;
if(isEnable==false){
throw new RuntimeException("Assertion shoule be enable!");
}
}
}
何時需要使用斷言
1.可以在預(yù)計正常情況下程序不會到達的地方放置斷言 :assert false
2.斷言可以用于檢查傳遞給私有方法的參數(shù)害捕。(對于公有方法,因為是提供給外部的接口闷畸,所以必須在方法中有相應(yīng)的參數(shù)檢驗才能保證代碼的健壯性)
3.使用斷言測試方法執(zhí)行的前置條件和后置條件
4.使用斷言檢查類的不變狀態(tài)尝盼,確保任何情況下,某個變量的狀態(tài)必須滿足佑菩。(如age屬性應(yīng)大于0小于某個合適值)
什么地方不要使用斷言
斷言語句不是永遠會執(zhí)行盾沫,可以屏蔽也可以啟用
因此:
1.不要使用斷言作為公共方法的參數(shù)檢查,公共方法的參數(shù)永遠都要執(zhí)行
2.斷言語句不可以有任何邊界效應(yīng)殿漠,不要使用斷言語句去修改變量和改變方法的返回值
參考:
http://jcp.org/en/jsr/detail?id=41
http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html
http://www-128.ibm.com/developworkers/cn/java/jdiag0723/
http://www-128.ibm.com/developworkers/cn/java/jmerlin/part9/