前言
? ? 最近看項目代碼,發現里面有大量的斷言。已經看不懂了,偷偷百度學習一下。
?百度搜索 斷言:斷言表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行后,最終用戶在遇到問題時可以重新啟用斷言。
有點拗口,個人覺得 斷言就是在程序員在程序運行前,預估某個變量的值。如果程序在運行時預估值與實際值不相等,則拋出異常提示。那么斷言實際上主要是應用在程序調試上(雖然網上很多文章說 在生產上關閉斷言是把孩子和洗澡水一起倒掉了)。
動手測試一下 增強記憶。
測試--未開啟斷言
代碼:
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!");
}
}
運行結果:
因為未開啟斷言,所以斷言不起作用。
Testing Assertion start
Testing Assertion passed!
測試 啟動斷言
代碼同上,運行時設置運行參數,以Eclipse為例
運行結果:
當數值與預估不一直時報出異常:
Exception in thread "main" java.lang.AssertionError?
at assertTest.AssertExample.main(AssertExample.java:7)
Testing Assertion start
測試 正確預測
代碼:
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!");
? }
}
運行結果:
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!");
}
}
運行結果:
Testing Assertion start
Exception in thread "main" java.lang.AssertionError: x is error
at assertTest.AssertExample.main(AssertExample.java:7)
后記
? ?1.斷言尤其適合在一些循環的調試中,當循環值或者變量發送變化后,進行調試。
? ? 2.代碼中一些常用的字符合法性檢查可以交由斷言來實現
public static void assertObjectNotNull(String fieldName, Object fieldValue) {
/* if (fieldValue == null) {
throw new IllegalArgumentException(String.format("[%s]不能為空。", fieldName));
}*/
assert(null!=fieldValue):fieldName+"字段不能為空";
}