建議19 : 斷言不是雞肋
基本用法:
assert <布爾表達式>
assert <布爾表達式> : <錯誤信息>
在布爾表達式為假時,拋出AssertionError錯誤。
- assert默認是不啟用的。
斷言的目的是為了能夠快速、方便的檢查到程序異常,使用用assert關鍵字。 - assert拋出的異常AssertError是繼承自Error的。
斷言失敗后,JVM拋出的錯誤是嚴重的,必須處理。
不可使用的情況:
- 對外公開的方法。即public方法。例子:
public class Client {
public static void main(String[] args) {
StringUtils.encode(null);
}
}
//字符串處理工具類
class StringUtils{
public static String encode(String str){
assert str!=null:"加密的字符串為null"; /*加密處理*/
}
}
調(diào)用者合理調(diào)用卻報錯。
2.在執(zhí)行邏輯代碼的情況下。
assert在開發(fā)時可以運行,在生產(chǎn)系統(tǒng)中則不需要其運行,所以用assert去處理邏輯永遠都不會執(zhí)行。如下:
public void doSomething (List list, Object element){
assert list.remove(element):"刪除元素" + element + "失敗"
}
下面三種情況可以使用:
(1)在私有方法中放置assert作為輸入?yún)?shù)的校驗
在私有方法中可以放置assert校驗輸入?yún)?shù),因為私有方法的使用者是作者自己,私有方法的調(diào)用者和被調(diào)用者之間是一種弱契約關系,或者說沒有契約關系,其間的約束是依靠作者自己控制的,因此加上assert可以更好地預防自己犯錯,或者無意的程序犯錯。
(2)流程控制中不可能達到的區(qū)域
這類似于JUnit的fail方法,其標志性的意義就是:程序執(zhí)行到這里就是錯誤的,例如:
public void doSomething(){
int i = 7;
while(i >7){
/*業(yè)務處理*/
}
assert false:"到達這里就表示錯誤";
}
(3)建立程序探針
我們可能會在一段程序中定義兩個變量,分別代表兩個不同的業(yè)務含義,但是兩者有固定的關系,例如var1=var2*2,那我們就可以在程序中到處設“樁”,斷言這兩者的關系,如果不滿足即表明程序已經(jīng)出現(xiàn)了異常,業(yè)務也就沒有必要運行下去了