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

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

    @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. vtk学习记录(一)——vtk工程配置与生成

    前言 图形图像这块儿,最近因为工作需要接触的相对多了点儿,精力基本上也都投入了这块儿,搞的天天要死要活,毕竟我一个.net的突然来到cxx的世界,也是很苦恼的,也是头一次见到新建工程就需要配置并且解决 ...

  2. Java开发中模拟接口工具moco的使用

    场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...

  3. mybaitis

    resultType="java.util.HashMap" SELECT DISTINCT c.COMPANY_LEVEL, ) over ( partition BY COMP ...

  4. 分布式事务 --- 2PC 和 3PC

    文章部分图片来自参考资料,侵删 概述 上一篇我们讲到CAP 理论,分区容错性,一致性,可用性三者不可能同时存在,而分区容错性又是客观存在的,那么为了保证可用性,我们牺牲了一致性,虽然我们保证不了强一致 ...

  5. 计算机基础,Python - Map和Reduce

    例子1. python中实现hashable def __hash__(self): hashes = map(hash, self.components) return functools.redu ...

  6. XMPP详解

    https://www.jianshu.com/p/84d15683b61e https://www.cnblogs.com/lurenq/p/7026983.html 1. xmpp简介 XMPP ...

  7. web渗透(转)

    某天比较无聊,听一个朋友推荐httpscan这款工具,于是就下载下来试试. 首先对某学校网段开始进行测试. 1   python httpscan.py **.**.**.0/24 测试时发现有个比较 ...

  8. java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time.....

    SpringBoot 2.1.4启动时报错 java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecogniz ...

  9. 主席树(可持久化线段树)静态区间第K小

    传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+ ...

  10. Cisco AP-格式化AP

    故障情况:APC11-AP04#sho capwap ip config LWAPP Static IP ConfigurationIP Address         172.17.239.204I ...