【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇

⚠⚠⚠自信攻城狮小名又来攻城啦⚠⚠⚠

【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇

CRUD攻城狮平时最常见的问题是啥?莫过于做判空操作的时候报NullPointerException

踩坑路程


下面小名来给大家列举一下小名平日常见的 判空报错以及正确操作:

场景一:

PracticeUser practiceUser = new PracticeUser();

if (!practiceUser.getName().equals(null) ) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

返回值:
因为practiceUser 为空,所以刚运行就会报 空指针异常

Exception in thread "main" java.lang.NullPointerException
	at eamon.daily.practice.user.controller.PracticeUserController.main(PracticeUserController.java:48)

场景二:

所以我们下意识的就会想到,改成这样:

PracticeUser practiceUser = new PracticeUser();

if (!null.equals(practiceUser.getName())) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

此时便会报编译时异常
【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇
这是因为null是无法调用任何方法的。
【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇


场景三:

此时此刻,因为practiceUser.getName()是字符串,所以我们便会想到最常用的一种方式

PracticeUser practiceUser = new PracticeUser();

if (!practiceUser.getName().equals("")) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

但是这样的话,同理,依然会在运行到practiceUser这里时会报空指针异常

Exception in thread "main" java.lang.NullPointerException
	at eamon.daily.practice.user.controller.PracticeUserController.main(PracticeUserController.java:48)

【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇


场景四:

此时,便是我们平时常用最容易犯错误的地方

PracticeUser practiceUser = new PracticeUser();

if (!"".equals(practiceUser.getName())) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

“”.equals() 相当于new String().equals() , 此时practiceUser.getName()为null,这样判断结果必为true
【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇

所以我们应该修改为practiceUser.getName() != null就对了,不过在平时开发的时候我们应该写成null!=practiceUser.getName() && !"".equals(practiceUser.getName())会更保险些,即:

PracticeUser practiceUser = new PracticeUser();

if (null!=practiceUser.getName() && !"".equals(practiceUser.getName())) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

返回值:没数据


场景五:

最后一种是最保险的一种方案,调用StringUtils中的isNotBlank()方法:

PracticeUser practiceUser = new PracticeUser();

if (StringUtils.isNotBlank(practiceUser.getName())) {
    System.out.println("有数据");
} else {
    System.out.println("没数据");
}

返回值:没数据

首先我们先来看看StringUtils中isNotBlank()方法的代码实现
【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇

  1. 接下来我们来们一下mybatis-plus-3.3.2中的isBlank()实现方法
    【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇
  2. 我们再来看下commons-lang3中的isBlank()实现方法
    【我发现!⚠】归纳几种对象中字符串“判空”花式报错 ““.equals(dto.getValue) 与 dto.getValue.equals(““) 以及 isNotBlank() 的爱恨情仇
    看到上面的源码,我们发现他们都调用了
boolean isWhitespace(char ch)

此方法用于判断指定字符是否为空白字符,空白符包含:空格、tab键、换行符

总结:两者的isBlank()方法都是在判断
1. 是否null
2. 是否为“”
3. 进行了为空(字符串都为空格、制表符、tab 的情况)的判断,例如: " "

如果觉得小名的文章帮助到了您,请关注小名,支持一下小名
上一篇:ksvcreate: Process(m000) creation failed 处理


下一篇:常见的性能测试模型