[经验] 关于 Java 中的非空判断
在写项目的时候, 遇到一个问题
假设有一个控制层接口为:
@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 中的非空判断的更多相关文章
- java基础之----非空判断
大家好,第一次写博客,一直想写博客,用于自我总结,也用于帮助新同学成长. 平常我们开发的时候,用到很多非空判断,但是很多同学用到的地方不是很准确,这里,我把自己平时遇到的坑跟大家说说.我废话不多,只想 ...
- Javascript 中的非空判断 undefined,null, NaN的区别
JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...
- (转载)Javascript 中的非空判断 undefined,null, NaN的区别
原文地址:https://blog.csdn.net/oscar999/article/details/9353713 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C ...
- java中常用的空判断
Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字 ...
- List和String的非空判断
1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...
- 异常分类和异常的产生过程解析和Objects非空判断
java.lang.Throwable类是java语言中所有错误的异常的超类. Exception:编译期异常,进行编译(写代码)java程序出现的问题 RuntimeExeption:运行期异常,j ...
- C/C++ 指针的非空判断
一定要分得清楚C和C++的“空指针常量”不是一样的.C标准不保证NULL等于0,所以做指针非空判断时,应该用if(p != NULL):因为“上下文转换到bool值”的统一性,C++就应该用if(p) ...
- java8 Optional优雅非空判断
java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...
- proto3 不支持内建类型的非空判断即 hasXXX
proto3 移除了内建类型的非空判断方法 即代码生成工具不会为 bool int 等类型生成has方法 有使用过proto2 或者其它rpc 框架的人都知道使用has 方法去判断消息里的值是否设置, ...
随机推荐
- 爬虫 - Scrapy中间件
前提:看Scrapy架构图 不管什么Middlewares,都写在middlewares.py里面. 然后在settings.py里的DOWNLOADER_MIDDLEWARES或者SPIDER_MI ...
- SpringBoot启动后自动打开浏览器访问项目
之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...
- C++之void是什么?
void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型: 2. 如果函数无参数,那么应声明其参数为void: 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void ...
- JS中的 '+' 号
当用作单目操作符的时候,+操作符不会对Number类型产生影响.但如果应用在字符串类型上,会将其转换为数字: var a = 25;a =+ a; //对a值没有影响console.log(a); / ...
- ASP.NET Core搭建多层网站架构【8.1-使用ViewModel注解验证】
2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.1-使用ViewModel注解验证] 使用V ...
- 寒假pta二
整除光棍 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在 ...
- Vue 项目 在局域网内访问
之前在百度上看到过很多中 关于局域网访问项目的方法, 在这里,个人推荐两种比较喜欢的方法 一.直接在项目的package.json文件中进行配置 ,代码如下 "scripts": ...
- 新建文件的UID和GID
默认情况下:新建文件的用户ID为操作当前文件进程的有效用户ID(参考以前文章),新建文件的组ID为操作当前文件的进程的有效组ID 特殊情况:当当前新建文件的目录的SET-GID位被设置时,那么新建文件 ...
- Redis注意点记录
场景:1主2从 1.不使用哨兵模式,则当主机宕机后,从机并不会自动切换到Master状态,仍旧是Slave,若主机重新恢复,则从机进行自动连接 2.使用哨兵模式后,主机宕机,从机会根据分配的权值在从机 ...
- Android、iOS与Servlet接口上传文件和JSON串的交互
package etcom.servlet; import java.io.File; import java.io.IOException; import java.sql.Connection; ...