前言
? ? 最近看項目代碼,發(fā)現(xiàn)里面有大量的斷言。已經(jīng)看不懂了,偷偷百度學(xué)習(xí)一下。
?百度搜索 斷言:斷言表示為一些布爾表達(dá)式,程序員相信在程序中的某個特定點該表達(dá)式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運(yùn)行后,最終用戶在遇到問題時可以重新啟用斷言。
有點拗口,個人覺得 斷言就是在程序員在程序運(yùn)行前,預(yù)估某個變量的值。如果程序在運(yùn)行時預(yù)估值與實際值不相等,則拋出異常提示。那么斷言實際上主要是應(yīng)用在程序調(diào)試上(雖然網(wǎng)上很多文章說 在生產(chǎn)上關(guān)閉斷言是把孩子和洗澡水一起倒掉了)。
動手測試一下 增強(qiáng)記憶。
測試--未開啟斷言
代碼:
public class AssertExample {
public static void main(String args[]) {
int x = 1;
System.out.println("Testing Assertion start");
assert (x == 2);
System.out.println("Testing Assertion passed!");
}
}
運(yùn)行結(jié)果:
因為未開啟斷言,所以斷言不起作用。
Testing Assertion start
Testing Assertion passed!
測試 啟動斷言
代碼同上,運(yùn)行時設(shè)置運(yùn)行參數(shù),以Eclipse為例

運(yùn)行結(jié)果:
當(dāng)數(shù)值與預(yù)估不一直時報出異常:
Exception in thread "main" java.lang.AssertionError?
at assertTest.AssertExample.main(AssertExample.java:7)
Testing Assertion start
測試 正確預(yù)測
代碼:
public class AssertExample {
public static void main(String args[]) {
? ? ?int x = 1;
? ? System.out.println("Testing Assertion start");
? ? assert (x == 1);
? ? System.out.println("Testing Assertion passed!");
? }
}
運(yùn)行結(jié)果:
Testing Assertion start
Testing Assertion passed!
測試 ?主動報出異常信息
代碼:
public class AssertExample {
public static void main(String args[]) {
int x = 1;
System.out.println("Testing Assertion start");
assert x == 2 :"x is error";
System.out.println("Testing Assertion passed!");
}
}
運(yùn)行結(jié)果:
Testing Assertion start
Exception in thread "main" java.lang.AssertionError: x is error
at assertTest.AssertExample.main(AssertExample.java:7)
后記
? ?1.斷言尤其適合在一些循環(huán)的調(diào)試中,當(dāng)循環(huán)值或者變量發(fā)送變化后,進(jìn)行調(diào)試。
? ? 2.代碼中一些常用的字符合法性檢查可以交由斷言來實現(xiàn)
public static void assertObjectNotNull(String fieldName, Object fieldValue) {
/* if (fieldValue == null) {
throw new IllegalArgumentException(String.format("[%s]不能為空。", fieldName));
}*/
assert(null!=fieldValue):fieldName+"字段不能為空";
}