前言
最近朋友说遇到一个无解的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;
}
然后日志神奇的出现
当看到这条日志,我就有点懵逼了。后面朋友跟我说他怀疑是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难以解决,并不是因为遇到技术难题,而是因为一些我们平时没注意的小细节引起
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦