在写项目的时候, 遇到一个问题

假设有一个控制层接口为:

    @ResponseBody
@RequestMapping(value = "test", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public Result<String> test(String user, String number, String time){
String type="error";
try{
rType = SendType.create_send.toString();
return firstSendService.createSend(type,uName, pNum, time);
}catch (Exception ex){
LOGGER.error(ex.getMessage(), ex);
}
return Result.failure(type, "fail of connect");
}

前端在调用这个接口的时候, 并没有传递参数, 于是  user, number, time 就默认为 null.

然后在服务层, 有一个方法

    public Result<String> createSend(String type, String user, String number, String time) throws Exception {
String token = "not fond";
try{
if(user.isEmpty() && StringUtils.isBlank(user)){
return Result.failure(type, "user is not null");
}
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(user).append(time);
String signChar = stringBuffer.toString();
token = TokenUtil.sign(signChar);
}catch (Exception ex){
LOGGER.error(ex.getMessage(), ex);
}
return Result.success(type, token);
}

其中, 关于参数的验证中

if(user.isEmpty() && StringUtils.isBlank(user)){
return Result.failure(type, "user is not null");
}

这里的判断条件并未被执行, 去验证了一下

换了一种方法

然后再来看看 StringUtils.isBlank();

再把 null 变成 "" 试试,

也没什么问题, 那么再来试试看 StringUtils.isNotBlank();

如上图所示, isNotBlank() 的判断是跟 isBlank() 反过来的.

于是, 得出一个结论:

(0)  对于  isEmpty() , 当字符串为 "" 时, return true; 但是 isEmpty() 不能用于判断为 null 的字符串, 会报 空指针异常 的错误,

所以 isEmpty()  更适合写  if(str == "" && str.isEmpty()) { return }

(1) 相较于 isEmpty()  只能判断 "" 的字符串, isBlank() 的功能性要更大更完善一些, 当字符串为 null 时, isBlank()  为 true; isNotBlank() 则跟 isBlank() 相反, 为 false.

所以 isBlank()  更适合写 if( str == null && StringUtils.isBlank(str)){ return }  或者  if( str == "" && StringUtils.isBlank(str)){ return }

但是

这样是不行的, 看来 isBlank() 好像看起来要更加全能一些, 因为有时候参数有可能为 null, 也有可能为"" ,用 isBlank() 的话可以避免服务器停掉, 如何优雅的抛出错误或者异常, 且避免服务器的运行因此受到影响, 是我在努力的一个方向, 希望这些可以有些帮助

再补上一点

这就奇怪了, 话说上面的 if( a.isEmpty() || StringUtils.isBlank(a)){ } 中, || 不是如果左边不成功就使用右边的判断条件么? 为什么会直接报错呢? 那如果是 || 的判断是先判断左边, 那在 a == "" 的时候,为什么又可以成功运行? isEmpty() 这么坑的么?

再来一组对比

那还是强烈推荐使用  isBlank()  吧, "" 和 isEmpty() 是局限性有点大, 灵活性不够高, 容易出事....

[经验] 关于 Java 中的非空判断的更多相关文章

  1. java基础之----非空判断

    大家好,第一次写博客,一直想写博客,用于自我总结,也用于帮助新同学成长. 平常我们开发的时候,用到很多非空判断,但是很多同学用到的地方不是很准确,这里,我把自己平时遇到的坑跟大家说说.我废话不多,只想 ...

  2. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

  3. (转载)Javascript 中的非空判断 undefined,null, NaN的区别

    原文地址:https://blog.csdn.net/oscar999/article/details/9353713 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C ...

  4. java中常用的空判断

    Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字 ...

  5. List和String的非空判断

    1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...

  6. 异常分类和异常的产生过程解析和Objects非空判断

    java.lang.Throwable类是java语言中所有错误的异常的超类. Exception:编译期异常,进行编译(写代码)java程序出现的问题 RuntimeExeption:运行期异常,j ...

  7. C/C++ 指针的非空判断

    一定要分得清楚C和C++的“空指针常量”不是一样的.C标准不保证NULL等于0,所以做指针非空判断时,应该用if(p != NULL):因为“上下文转换到bool值”的统一性,C++就应该用if(p) ...

  8. java8 Optional优雅非空判断

    java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...

  9. proto3 不支持内建类型的非空判断即 hasXXX

    proto3 移除了内建类型的非空判断方法 即代码生成工具不会为 bool int 等类型生成has方法 有使用过proto2 或者其它rpc 框架的人都知道使用has 方法去判断消息里的值是否设置, ...

随机推荐

  1. AxureRP 9安装、激活、汉化

    AxureRP安装 AxureRP激活 AxureRP汉化

  2. Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)

    最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能 Laravel + crontab 添加 crontab ...

  3. MongoDB - 用户名密码认证

    参考 offical doc medium Mongo roles说明 https://docs.mongodb.com/manual/reference/built-in-roles/#userAd ...

  4. Python--比较两个字典部分value是否相等(可以用于接口自动化)

    eg:例如你调用了一个新增的接口,以往功能测试的话,你再web端新增一个店铺之后,你肯定要去数据库中查看,这些数据插入的对不对,是否正确的插入了每个字段 # 比较两个字典部分是否相等 def comp ...

  5. VS2013 Solution Explorer can not open

    Delete content under the path: C:\Users\username\AppData\Local\Microsoft\VisualStudio\12.0\Component ...

  6. JS-this的使用

    做前端开发已经半年之多了,前几天看见apply时心生疑惑,于是查阅了好多资料但还是不太理解,只知道是源于this的问题,今天偶然看到了阮一峰大佬的讲解js中的this问题(http://www.rua ...

  7. .NET中的字符串(2):你真的了解.NET中的String吗?

    概述 String在任何语言中,都有它的特殊性,在.NET中也是如此.它属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但是它却放在了堆中.希望通过本文能够使大家对.NET中 ...

  8. ubuntu 命令记录

    1.su root  进入root模式 2.ifconfig 查看ip地址 3.ls 查看文件 4./etc/init.d/matrix-gui-2.0 stop 关闭matrix界面 5.cd /文 ...

  9. 有未经处理的异常: 0xC00000FD: Stack overflow

    将“项目属性.链接器.系统.堆栈保留大小”设大一点比如16000000 这是我在网上找到的答案,很好的解决了我的问题,忘了是哪位大神了,总之,向大神致敬

  10. vue 使用心得---工作中一些关键点

    1.自定义组件 使用 v-for 循环,最好另外多加上 v-bind:key="items_name",这是特殊用的:key,而不是普通的 :属性 例:<Uiroom> ...