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方法时,判空校验后依旧出现了问题。个人猜测原因:系统框架在数据转换时的逻辑问题,由于是公司内部研究所提供的框架,并不知道其具体的内部逻辑,当然也不具备大众参考性,只是以后在校验数据库提醒,应当考虑这种问题。

20210218更新:通过研究系统的源代码,发现系统框架进行转换数据为实体类时,判空使用java原始的StringUtils的判空方法,导致如果数据库为空,前台不显示,但转换成字符,内置数据却成了字符串’null‘.而后在更新操作等过程中又重复写入到了数据库,导致数据错误,从而在运算等逻辑代码中报错。解决这个问题的方法是重构判空方法,引用jdk提供的StringUtils方法外,增加str.equal("null")的判定。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,如果需要允许 null 值的校验,可以在 valueOf() 方法的基础上进行扩展。具体来说,可以在枚举类型添加一个 UNKNOWN 枚举值,用于表示输入值为 null 或无法识别的值。示例代码如下: ```java public enum Fruit { APPLE, BANANA, ORANGE, UNKNOWN; public static Fruit fromString(String input) { if (input == null) { return UNKNOWN; } try { return Fruit.valueOf(input.toUpperCase()); } catch (IllegalArgumentException ex) { return UNKNOWN; } } } public class EnumValidationDemo { public static void main(String[] args) { String input1 = "APPLE"; Fruit fruit1 = Fruit.fromString(input1); System.out.println(fruit1); String input2 = null; Fruit fruit2 = Fruit.fromString(input2); System.out.println(fruit2); } } ``` 在上面的代码,我们在 Fruit 枚举类型添加了一个 UNKNOWN 枚举值,用于表示输入值为 null 或无法识别的值。然后,我们定义了一个静态方法 fromString(),该方法接受一个字符串参数,并返回对应的 Fruit 枚举值。在 fromString() 方法,我们首先判断输入值是否为 null,如果是,则返回 UNKNOWN 枚举值。否则,我们尝试使用 valueOf() 方法将输入值转换为 Fruit 枚举值,如果转换失败,则返回 UNKNOWN 枚举值。在主函数,我们分别使用 input1 和 input2 来测试 fromString() 方法,其 input1 的值为 "APPLE",input2 的值为 null。运行程序后,输出结果分别为 APPLE 和 UNKNOWN,符合预期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值