zoukankan      html  css  js  c++  java
  • [经验] 关于 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() 是局限性有点大, 灵活性不够高, 容易出事....

      

  • 相关阅读:
    [BZOJ3530][SDOI2014]数数
    [Luogu3121][USACO15FEB]审查Censoring
    [BZOJ1212][HNOI2004]L语言
    [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
    AC自动机总结
    (三)LDAP 新增用户
    (二) LDAP 安装
    (一)LDAP 简介
    (十三)VMware Harbor 身份验证模式
    loj#2541. 「PKUWC2018」猎人杀
  • 原文地址:https://www.cnblogs.com/unityworld/p/11419864.html
Copyright © 2011-2022 走看看