1、StringUtils的null安全校驗
在java項目編程,經常調試出現的問題就是空指針錯誤。出現錯誤的原因,是在程序執行的過程中莫名的出現了各種參數爲空的錯誤,基於大型項目,功能,方法的來源,以及數量,我們並不能很好的鑑定在程序執行的過程中,哪些參數是問題參數。因此,在除去必定不爲空的參數(靜態變量,人爲初始化值的數據),一般得,我們會使用if(str!=null&&str!="")作爲判空校驗。
這兩種情況,java的jdk提供了一個對應的方法StringUtils.isEmpty(str).
StringUtils在commons-lang-2.2.jar包中:org.apache.commons.lang.StringUtils
StringUtils方法的操作對象是java.lang.String類型的對象,是JDK提供的String類型操作方法的補充,並且是null安全的(即如果輸入參數String爲null則不會拋出NullPointerException.
網上已有文字關於StringUtils的使用 包括isEmpty,isNotEmpty,isBlank,isNotBlank,這裏摘錄:
1. public static boolean isEmpty(String str)
判斷某字符串是否爲空,爲空的標準是 str==null 或 str.length()==0
下面是示例:
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //注意在 StringUtils 中空格作非空處理
StringUtils.isEmpty(" ") = false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false
2. public static boolean isNotEmpty(String str)
判斷某字符串是否非空,等於 !isEmpty(String str)
下面是示例:
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty("bob") = true
StringUtils.isNotEmpty(" bob ") = true
3. public static boolean isBlank(String str)
判斷某字符串是否爲空或長度爲0或由空白符(whitespace) 構成
下面是示例:
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("\t \n \f \r") = true //對於製表符、換行符、換頁符和回車符
StringUtils.isBlank() //均識爲空白符
StringUtils.isBlank("\b") = false //"\b"爲單詞邊界符
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false
4. public static boolean isNotBlank(String str)
判斷某字符串是否不爲空且長度不爲0且不由空白符(whitespace) 構成,等於 !isBlank(String str)
下面是示例:
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank("\t \n \f \r") = false
StringUtils.isNotBlank("\b") = true
StringUtils.isNotBlank("bob") = true
StringUtils.isNotBlank(" bob ") = true
可以看到isBlank比起isEmpy,涵蓋的範圍更廣
另外,我們經常會對數據進行去空格的操作,以防止數據不爲空但是沒有數據的問題,舊時採用的str.trm()的方法。這種去空格的方法存在一個問題,如果str本來爲null,調用trm()方法就會報錯空指針。同樣的,StringUtils也提供一個trim方法,可以解決這個問題。
5. public static String trim(String str)
去掉字符串兩端的控制符(control characters, char <= 32) ,如果變爲 null 或"",則返回 null
下面是示例:
StringUtils.trim(null) = null
StringUtils.trim("") = ""
StringUtils.trim(" ") = ""
StringUtils.trim(" \b \t \n \f \r ") = ""
StringUtils.trim(" \n\tss \b") = "ss"
StringUtils.trim(" d d dd ") = "d d dd"
StringUtils.trim("dd ") = "dd"
StringUtils.trim(" dd ") = "dd"
另外還有trim方法的兩種變種,分別返回null/""
6. public static String trimToNull(String str)
去掉字符串兩端的控制符(control characters, char <= 32) ,如果變爲 null 或"",則返回 null
下面是示例:
StringUtils.trimToNull(null) = null
StringUtils.trimToNull("") = null
StringUtils.trimToNull(" ") = null
StringUtils.trimToNull(" \b \t \n \f \r ") = null
StringUtils.trimToNull(" \n\tss \b") = "ss"
StringUtils.trimToNull(" d d dd ") = "d d dd"
StringUtils.trimToNull("dd ") = "dd"
StringUtils.trimToNull(" dd ") = "dd"
7. public static String trimToEmpty(String str)
去掉字符串兩端的控制符(control characters, char <= 32) ,如果變爲 null 或 "" ,則返回 ""
下面是示例:
StringUtils.trimToEmpty(null) = ""
StringUtils.trimToEmpty("") = ""
StringUtils.trimToEmpty(" ") = ""
StringUtils.trimToEmpty(" \b \t \n \f \r ") = ""
StringUtils.trimToEmpty(" \n\tss \b") = "ss"
StringUtils.trimToEmpty(" d d dd ") = "d d dd"
StringUtils.trimToEmpty("dd ") = "dd"
StringUtils.trimToEmpty(" dd ") = "dd"
上面的trim是去掉空格,而strip去掉的是空白符
8. public static String strip(String str)
去掉字符串兩端的空白符(whitespace) ,如果輸入爲 null 則返回 null
下面是示例(注意和 trim() 的區別):
StringUtils.strip(null) = null
StringUtils.strip("") = ""
StringUtils.strip(" ") = ""
StringUtils.strip(" \b \t \n \f \r ") = "\b"
StringUtils.strip(" \n\tss \b") = "ss \b"
StringUtils.strip(" d d dd ") = "d d dd"
StringUtils.strip("dd ") = "dd"
StringUtils.strip(" dd ") = "dd"
9. public static String stripToNull(String str)
去掉字符串兩端的空白符(whitespace) ,如果變爲 null 或"",則返回 null
下面是示例(注意和 trimToNull() 的區別):
StringUtils.stripToNull(null) = null
StringUtils.stripToNull("") = null
StringUtils.stripToNull(" ") = null
StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"
StringUtils.stripToNull(" \n\tss \b") = "ss \b"
StringUtils.stripToNull(" d d dd ") = "d d dd"
StringUtils.stripToNull("dd ") = "dd"
StringUtils.stripToNull(" dd ") = "dd"
10. public static String stripToEmpty(String str)
去掉字符串兩端的空白符(whitespace) ,如果變爲 null 或"" ,則返回""
下面是示例(注意和 trimToEmpty() 的區別):
StringUtils.stripToNull(null) = ""
StringUtils.stripToNull("") = ""
StringUtils.stripToNull(" ") = ""
StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"
StringUtils.stripToNull(" \n\tss \b") = "ss \b"
StringUtils.stripToNull(" d d dd ") = "d d dd"
StringUtils.stripToNull("dd ") = "dd"
StringUtils.stripToNull(" dd ") = "dd"
具體博客信息參考https://blog.csdn.net/weixin_42290280/article/details/82591161
因此總結一下,判空主要的兩個函數isEmpt,isBlank,兩個去空格操作trim,strip
2、str.equal("null")
上面所有的判空方法都能處理絕大多數的問題,不過存在一種字符串不爲空確是空的情況,即str.equal("null") 出現這種問題的具體原因,暫時未確定,場景爲:oracle數據庫設置數據默認數據爲空格時,更新其數據爲null時,數據庫會存下空格,在系統框架進行轉換數據爲實體類時,被賦予了“null”值,以至於在使用get方法時,判空校驗後依舊出現了問題。個人猜測原因:系統框架在數據轉換時的邏輯問題,由於是公司內部研究所提供的框架,並不知道其具體的內部邏輯,當然也不具備大衆參考性,只是以後在校驗數據庫提醒,應當考慮這種問題。