美文网首页程序员
记一次判断值是否存在遇到的神奇问题

记一次判断值是否存在遇到的神奇问题

作者: linyb极客之路 | 来源:发表于2022-04-26 09:30 被阅读0次

前言

最近朋友说遇到一个无解的bug,他有个业务需求是VIP用户才能参与活动的业务场景。他判断vip的伪代码形如下

private boolean isVip(UserDTO userDTO){
        List<Integer> vipUserIds = userService.vipUserIds();
        for (Integer vipUserId : vipUserIds) {
            if(vipUserId.equals(userDTO.getUserId())){
                return true;
            }
        }


        return false;
    }

他传了一个userId为10000(注:10000为示例数据)的vip用户,结果发现这个判断一直是false。于是就找到我帮他看下,这代码看着没啥问题,我就让他先确认一下数据库是否存在这个vip用户,朋友非常肯定的说存在的。

排查

因为朋友确定数据库存在这条记录,后面我就让他判断vip的逻辑上加下日志,改后的伪代码如下

private boolean isVip(UserDTO userDTO){
        List<Integer> vipUserIds = userService.vipUserIds();
        for (Integer vipUserId : vipUserIds) {
            if(vipUserId.equals(userDTO.getUserId())){
                return true;
            }
        }

        log.warn("userId-->{} is not in vipList-->{}",userDTO.getUserId(),vipUserIds);

        return false;
    }

然后日志神奇的出现


f03cb8b86e5b94006b8e3bb4a796883a.png

当看到这条日志,我就有点懵逼了。后面朋友跟我说他怀疑是JDK版本有问题,但我的第六感告诉这不至于。

多年写bug经验告诉我,啥都会骗人,只有源码不会骗人。因为判断是否vip的代码就一句equal,直接点进去了事。这equal的源码如下

   public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

看到这个代码后,我想有些老司机应该有点感觉。后面我就跟朋友说你有没有可能类型写错了,你的userId类型是Integer吗?于是他翻一下代码,果然他userId的类型写成String

修复

后面朋友把userId的类型也改成Integer,问题圆满解决。

总结

有时候有些bug难以解决,并不是因为遇到技术难题,而是因为一些我们平时没注意的小细节引起

相关文章

  • 记一次判断值是否存在遇到的神奇问题

    前言 最近朋友说遇到一个无解的bug,他有个业务需求是VIP用户才能参与活动的业务场景。他判断vip的伪代码形如下...

  • js

    一、判断对象是否存在//判断对象是否存在,还要判断对象是否有null值if(!myObj){var myObj={...

  • PHP常用方法

    判断数组值是否存在 经常需要判断前端传过来的筛选参数, 如果存在有效值 sql中 就增加筛选条件判断前端是否传了有...

  • LeetCode028 实现strStr

    题目: 方法一:indexOf()方法,判断数组中是否存在判断条件中的值。如果存在,则返回第一次出现的索引;如果不...

  • [PHP] php数组元素

    (1)判断是否存在该索引 即使$arr["a"]的值是null,该索引也是存在的。 (2)判断索引是否被设置了 ...

  • json对象的判断

    是否空对象 判断是否存在对象 Object 的 hasOwnProperty() 方法返回一个布尔值,判断对象是否...

  • redis的键

    set a a返回值 ok keys *查看当前key值 exists a判断key是否存在 ,存在返回值为1,不...

  • ftl常用语法整理

    判空及默认值 ??:判断某个变量是否存在,返回boolean值 <#ifobject??> <#if ...

  • go map 2

    判断键是否存在的两种方式 1 从映射获取值并判断键是否存在 // 获取键Blue对应的值 colors := ma...

  • 布隆过滤器(Bloom Filter)

    解决高效地判断一个值是否存在的问题,具有很好的空间效率和时间效率。使用布隆过滤器可以验证某个值一定不存在和某个值*...

网友评论

    本文标题:记一次判断值是否存在遇到的神奇问题

    本文链接:https://www.haomeiwen.com/subject/lnjcyrtx.html