|
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
下面是示例:
123456 | StringUtils.isEmpty(null) = trueStringUtils.isEmpty("") = trueStringUtils.isEmpty(" ") = false //注意在 StringUtils 中空格作非空处理StringUtils.isEmpty(" ") = falseStringUtils.isEmpty("bob") = falseStringUtils.isEmpty(" bob ") = false | 2. public static boolean isNotEmpty(String str)
判断某字符串是否非空,等于 !isEmpty(String str)
下面是示例:
123456 | StringUtils.isNotEmpty(null) = falseStringUtils.isNotEmpty("") = falseStringUtils.isNotEmpty(" ") = trueStringUtils.isNotEmpty(" ") = trueStringUtils.isNotEmpty("bob") = trueStringUtils.isNotEmpty(" bob ") = true |
3. public static boolean isBlank(String str)
判断某字符串是否为空或长度为0或由空白符(whitespace) 构成
下面是示例:
12345678910 | StringUtils.isBlank(null) = trueStringUtils.isBlank("") = trueStringUtils.isBlank(" ") = trueStringUtils.isBlank(" ") = trueStringUtils.isBlank("\t \n \f \r") = true //对于制表符、换行符、换页符和回车符 StringUtils.isBlank() //均识为空白符StringUtils.isBlank("\b") = false //"\b"为单词边界符StringUtils.isBlank("bob") = falseStringUtils.isBlank(" bob ") = false | 4. public static boolean isNotBlank(String str)
判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成,等于 !isBlank(String str)
下面是示例:
12345678 | StringUtils.isNotBlank(null) = falseStringUtils.isNotBlank("") = falseStringUtils.isNotBlank(" ") = falseStringUtils.isNotBlank(" ") = falseStringUtils.isNotBlank("\t \n \f \r") = falseStringUtils.isNotBlank("\b") = trueStringUtils.isNotBlank("bob") = trueStringUtils.isNotBlank(" bob ") = true |
可以看到isBlank比起isEmpy,涵盖的范围更广
另外,我们经常会对数据进行去空格的操作,以防止数据不为空但是没有数据的问题,旧时采用的str.trm()的方法。这种去空格的方法存在一个问题,如果str本来为null,调用trm()方法就会报错空指针。同样的,StringUtils也提供一个trim方法,可以解决这个问题。
5. public static String trim(String str)
去掉字符串两端的控制符(control characters, char <= 32) ,如果变为 null 或&#34;&#34;,则返回 null
下面是示例:
12345678 | StringUtils.trim(null) = nullStringUtils.trim(&#34;&#34;) = &#34;&#34;StringUtils.trim(&#34; &#34;) = &#34;&#34;StringUtils.trim(&#34; \b \t \n \f \r &#34;) = &#34;&#34;StringUtils.trim(&#34; \n\tss \b&#34;) = &#34;ss&#34;StringUtils.trim(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.trim(&#34;dd &#34;) = &#34;dd&#34;StringUtils.trim(&#34; dd &#34;) = &#34;dd&#34; |
另外还有trim方法的两种变种,分别返回null/&#34;&#34;
6. public static String trimToNull(String str)
去掉字符串两端的控制符(control characters, char <= 32) ,如果变为 null 或&#34;&#34;,则返回 null
下面是示例:
12345678 | StringUtils.trimToNull(null) = nullStringUtils.trimToNull(&#34;&#34;) = nullStringUtils.trimToNull(&#34; &#34;) = nullStringUtils.trimToNull(&#34; \b \t \n \f \r &#34;) = nullStringUtils.trimToNull(&#34; \n\tss \b&#34;) = &#34;ss&#34;StringUtils.trimToNull(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.trimToNull(&#34;dd &#34;) = &#34;dd&#34;StringUtils.trimToNull(&#34; dd &#34;) = &#34;dd&#34; |
7. public static String trimToEmpty(String str)
去掉字符串两端的控制符(control characters, char <= 32) ,如果变为 null 或 &#34;&#34; ,则返回 &#34;&#34;
下面是示例:
12345678 | StringUtils.trimToEmpty(null) = &#34;&#34;StringUtils.trimToEmpty(&#34;&#34;) = &#34;&#34;StringUtils.trimToEmpty(&#34; &#34;) = &#34;&#34;StringUtils.trimToEmpty(&#34; \b \t \n \f \r &#34;) = &#34;&#34;StringUtils.trimToEmpty(&#34; \n\tss \b&#34;) = &#34;ss&#34;StringUtils.trimToEmpty(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.trimToEmpty(&#34;dd &#34;) = &#34;dd&#34;StringUtils.trimToEmpty(&#34; dd &#34;) = &#34;dd&#34; |
上面的trim是去掉空格,而strip去掉的是空白符
8. public static String strip(String str)
去掉字符串两端的空白符(whitespace) ,如果输入为 null 则返回 null
下面是示例(注意和 trim() 的区别):
12345678 | StringUtils.strip(null) = nullStringUtils.strip(&#34;&#34;) = &#34;&#34;StringUtils.strip(&#34; &#34;) = &#34;&#34;StringUtils.strip(&#34; \b \t \n \f \r &#34;) = &#34;\b&#34;StringUtils.strip(&#34; \n\tss \b&#34;) = &#34;ss \b&#34;StringUtils.strip(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.strip(&#34;dd &#34;) = &#34;dd&#34;StringUtils.strip(&#34; dd &#34;) = &#34;dd&#34; |
9. public static String stripToNull(String str)
去掉字符串两端的空白符(whitespace) ,如果变为 null 或&#34;&#34;,则返回 null
下面是示例(注意和 trimToNull() 的区别):
12345678 | StringUtils.stripToNull(null) = nullStringUtils.stripToNull(&#34;&#34;) = nullStringUtils.stripToNull(&#34; &#34;) = nullStringUtils.stripToNull(&#34; \b \t \n \f \r &#34;) = &#34;\b&#34;StringUtils.stripToNull(&#34; \n\tss \b&#34;) = &#34;ss \b&#34;StringUtils.stripToNull(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.stripToNull(&#34;dd &#34;) = &#34;dd&#34;StringUtils.stripToNull(&#34; dd &#34;) = &#34;dd&#34; |
10. public static String stripToEmpty(String str)
去掉字符串两端的空白符(whitespace) ,如果变为 null 或&#34;&#34; ,则返回&#34;&#34;
下面是示例(注意和 trimToEmpty() 的区别):
12345678 | StringUtils.stripToNull(null) = &#34;&#34;StringUtils.stripToNull(&#34;&#34;) = &#34;&#34;StringUtils.stripToNull(&#34; &#34;) = &#34;&#34;StringUtils.stripToNull(&#34; \b \t \n \f \r &#34;) = &#34;\b&#34;StringUtils.stripToNull(&#34; \n\tss \b&#34;) = &#34;ss \b&#34;StringUtils.stripToNull(&#34; d d dd &#34;) = &#34;d d dd&#34;StringUtils.stripToNull(&#34;dd &#34;) = &#34;dd&#34;StringUtils.stripToNull(&#34; dd &#34;) = &#34;dd&#34; |
具体博客信息参考https://blog.csdn.net/weixin_42290280/article/details/82591161
因此总结一下,判空主要的两个函数isEmpt,isBlank,两个去空格操作trim,strip
2、str.equal(&#34;null&#34;)
上面所有的判空方法都能处理绝大多数的问题,不过存在一种字符串不为空确是空的情况,即str.equal(&#34;null&#34;) 出现这种问题的具体原因,暂时未确定,场景为:oracle数据库设置数据默认数据为空格时,更新其数据为null时,数据库会存下空格,在系统框架进行转换数据为实体类时,被赋予了“null”值,以至于在使用get方法时,判空校验后依旧出现了问题。个人猜测原因:系统框架在数据转换时的逻辑问题,由于是公司内部研究所提供的框架,并不知道其具体的内部逻辑,当然也不具备大众参考性,只是以后在校验数据库提醒,应当考虑这种问题。
转发自java中简单的判空校验,即null安全校验 | 码农家园 |
|