斷言是用來檢查非法情況而不是錯誤情況的,用來幫開發者快速定位問題的位置。
異常處理用於對程序發生異常情況的處理,增強程序的健壯性和容錯性。
在防御式編程中經常會用斷言(Assertion)對參數和環境做出判斷,避免程序因不當的輸入或錯誤的環境而產生邏輯異常,斷言在很多語言中都存在,C、C++、Python都有不同的斷言表示形式。在Java中的斷言使用的是assert關鍵字,其基本的用法如下:
assert <布爾表達式>
assert <布爾表達式> : <錯誤信息>
1. assert特性
(1)assert默認是不啟用的
(2)assert拋出的異常AssertionError是繼承自Error的
2. 使用assert的三種情況
(1)在私有方法中放置assert作為輸入參數的校驗
在私有方法中可以放置assert校驗輸入參數,因為私有方法的使用者是作者自己,私有方法的調用者和被調用者之間是一種弱契約關系,或者說沒有契約關系,其間的約束是依靠作者自己控制的,因此加上assert可以更好地預防自己犯錯,或者無意的程序犯錯。
(2)流程控制中不可能達到的區域
這類似於JUnit的fail方法,其標志性的意義就是:程序執行到這里就是錯誤的,例如:
public void doSomething(){
2 int i = 7;
3 while(i >7){
4
5 }
6 assert false:"到達這里就表示錯誤";
7 }
(3)建立程序探針
我們可能會在一段程序中定義兩個變量,分別代表兩個不同的業務含義,但是兩者有固定的關系,例如var1=var2*2,那我們就可以在程序中到處設“樁”,斷言這兩者的關系,如果不滿足即表明程序已經出現了異常,業務也就沒有必要運行下去了。
3.斷言方法說明
(1) notNull(Object object)
當 object 不為 null 時拋出異常,notNull(Object object, String message) 方法允許您通過 message 定制異常信息。和 notNull() 方法斷言規則相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入參一定是 null;
(2) isTrue(boolean expression) / isTrue(boolean expression, String message)
當 expression 不為 true 拋出異常;
(3)notEmpty(Collection collection) / notEmpty(Collection collection, String message)
當集合未包含元素時拋出異常。
notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分別對 Map 和 Object[] 類型的入參進行判斷;
(4)hasLength(String text) / hasLength(String text, String message)
當 text 為 null 或長度為 0 時拋出異常;
(5)hasText(String text) / hasText(String text, String message)
text 不能為 null 且必須至少包含一個非空格的字符,否則拋出異常;
(6) isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)
如果 obj 不能被正確造型為 clazz 指定的類將拋出異常;
(7) isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)
subType 必須可以按類型匹配於 superType,否則將拋出異常;
public InputStream getData(String file){
Assert.hasText(file,"file入參不是有效的文件地址");
① 使用 Spring 斷言類進行方法入參檢測
…
}