java中簡單的判空校驗,即null安全校驗

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方法時,判空校驗後依舊出現了問題。個人猜測原因:系統框架在數據轉換時的邏輯問題,由於是公司內部研究所提供的框架,並不知道其具體的內部邏輯,當然也不具備大衆參考性,只是以後在校驗數據庫提醒,應當考慮這種問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章