当前位置: 首页 > 后端技术 > Java

记得判断值是不是遇到了神奇的问题

时间:2023-04-02 00:08:52 Java

前言最近有朋友说遇到了一个无法解决的bug。他有一个业务场景,VIP用户只能参与活动。他判断vip的伪代码如下privatebooleanisVip(UserDTOuserDTO){ListvipUserIds=userService.vipUserIds();for(IntegervipUserId:vipUserIds){if(vipUserId.equals(userDTO.getUserId())){返回真;}}返回假;}他传了一个userId为10000的vip用户(注:10000是样本数据),发现这个判断一直是false。于是就找我帮他看了一下。代码看着没问题,就让他确认数据库中是否存在vip用户。我的朋友非常肯定它确实如此。检查是因为我的朋友确认数据库中存在这条记录。后面会请他判断vip的逻辑,加个log。修改后的伪代码如下privatebooleanisVip(UserDTOuserDTO){ListvipUserIds=userService.vipUserIds();for(IntegervipUserId:vipUserIds){if(vipUserId.equals(userDTO.getUserId())){返回真;}}log.warn("userId-->{}不在vipList-->{}",userDTO.getUserId(),vipUserIds);返回假;然后日志神奇地出现了。看到这个日志,我有点懵。后来朋友告诉我,他怀疑是JDK版本有问题,但是我的第六感告诉我,不是这样的。多年写bug的经验告诉我,万物皆可骗人,只有源码是骗不了人的。因为判断是否是VIP的代码就是一句equal,直接点进去。这个equal的源码如下publicbooleanequals(Objectobj){if(objinstanceofInteger){returnvalue==((整数)obj).intValue();}返回假;}看到这段代码,觉得有点老司机应该有所感触。稍后,我会告诉我的朋友,你是否可能写错了类型。你的userId类型是Integer吗?于是他翻了一下代码,果然,他的userId的类型写成了String来修复。后来他的朋友也把userId的类型改成了Integer,问题也圆满解决了。总结有时候有些bug很难解决,并不是因为技术上的困难,而是因为一些我们平时不注意的小细节。