斷言(Assert)與異常(Exception)


  • ## 斷言和異常
斷言是用來檢查非法情況而不是錯誤情況的,用來幫開發者快速定位問題的位置。
異常處理用於對程序發生異常情況的處理,增強程序的健壯性和容錯性。
  • ## 斷言的使用
在防御式編程中經常會用斷言(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,否則將拋出異常;
使用 Assert 斷言類可以簡化方法入參檢測的代碼,如 InputStream getData(String file) 在應用 Assert 斷言類后,其代碼可以簡化為以下的形式:
public InputStream getData(String file){ 
    Assert.hasText(file,"file入參不是有效的文件地址"); 
    ① 使用 Spring 斷言類進行方法入參檢測 
… 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM