[经验] 关于 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 方法去判断消息里的值是否设置, ...
随机推荐
- 避坑之Hadoop安装伪分布式(Hadoop3.2.0/Ubuntu14.04 64位)
一.安装JDK环境(这个可以网上随意搜一篇教程了照着弄,这里不赘述) 安装成功之后 输入 输入:java -version 显示如下说明jdk安装成功(我这里是安装JDK8) 二.安装Hadoop3. ...
- Git创建合并和删除分支
创建并切换分支 git checkout命令加上-b参数表示创建并切换分支,以下为创建并切换到dev分支: 相当于先通过 $ git branch dev 命令创建dev分支,然后 $ git che ...
- txt文件太大打不开怎么办
#开始 最近在调试代码的时候,生成了一个400MB的日志文件 找了很多文本编辑器,都表示太大了打不开 QAQ #解决方案 百度下载 “txt杀手” 用这个软件把文本文件拆分成小份就可以打开了 输入如图 ...
- jQuery中$.fn
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法,那么后面你的每一个 ...
- Draw.io--自认为最好用的流程图绘制软件
draw.io 是一个强大简洁的在线的绘图网站,支持流程图,UML图,架构图,原型图等图标.支持Github,Google Drive, One drive等网盘同步,并且永久免费.如果觉得使用Web ...
- php 用mysqli的json_encode()转换出来 全是对象的问题
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/9/6 0006 * Time: 15:33 */ //查 ...
- React项目中遇到的那些坑
1.react中路由跳转后页面不置顶问题 问题: 从页面A跳转到页面B,页面A滚动到中间位置,跳转后页面B也会在中间位置 解决方法:在顶部组件的生命周期中进行判断,例如 componentWillRe ...
- php 基础 判断类型
八.PHP中判断类型 is_bool():判断是否是布尔型 is_int().is_integer()和 is_long():判断是否为整型. is_float().is_double()和 is_r ...
- No space left on device(转载)
本文转自 http://blog.163.com/ly_89/blog/static/186902299201191233058625/ =====================概述======== ...
- Ubuntu Rabbitmq 安装与配置
原文链接:http://blog.csdn.net/rickey17/article/details/72756766 添加源 新增公钥(不加会有警告) 更新源 安装rabbitmq-server e ...