网上找的一段代码突然爆了,项目出现大Bug!
来源:www.cnblogs.com/aspwebchh/p/12220673.html
本人是做游戏服务器开发的,碰到一个需求,给符合某些要求的玩家发送道具奖励,奖励的数量根据离线的天数计算。
这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。
计算两个时间间隔天数的函数没有现成的,自己又懒得写,就上谷歌搜了下,选了第一条结果,代码如下:
public static int differentDays(Date date1, Date date2) {Calendar cal1 = Calendar.getInstance();cal1.setTime(date1);Calendar cal2 = Calendar.getInstance();cal2.setTime(date2);int day1 = cal1.get(Calendar.DAY_OF_YEAR);int day2 = cal2.get(Calendar.DAY_OF_YEAR);int year1 = cal1.get(Calendar.YEAR);int year2 = cal2.get(Calendar.YEAR);if (year1 != year2) {//同一年int timeDistance = 0;for (int i = year1; i < year2; i++) {if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {//闰年timeDistance += 366;} else {//不是闰年timeDistance += 365;}}return timeDistance + (day2 - day1);} else {//不同年System.out.println("判断day2 - day1 : " + (day2 - day1));return day2 - day1;}}
代码来源:https://www.cnblogs.com/0201zcr/p/5000977.html
把代码复制到项目里,调试下,发现没问题就直接用了,毕竟谷歌结果第一名,放心。
这段代码跑了几个月一直没问题,但是到了 2020-1-1 日那天,有玩家反馈收到了几百封奖励邮件,高兴坏了,但是出于对游戏的热爱,还是通知了运营人员。
运营把 Bug 反馈到服务器这边后我开始排查,百思不得其解的是最近几天都没有更新服务器, 而前几天服务器都稳稳地,怎么突然就出 Bug 了呢?在公众号互联网架构师后台回复:8,可以获取架构师视频整套系统教程。
接下来就是分析玩家数据,结合代码逻辑确定问题所在,最终根据 Bug 的表现排除了所有可能性后,在公众号互联网架构师后台回复:8,可以获取架构师视频整套系统教程。,发现唯一可能出问题的地方就是那个网上复制过来的计算天数差的函数。
根据调试发现,这个函数在两个日期参数是不同的年份并且第一个日期大于第二个日期的时候,会返回一个错误的结果,比如:
differentDays("2020-1-1","2019-12-25"
理论上这么调用正确的结果是 -7,但是因为函数有 Bug,调用结果是 358。
于是本来不用发奖励,因为这种特殊情况一下子发出去 358 份,严重影响了游戏某类道具的平衡性。在公众号互联网架构师后台回复:8,可以获取架构师视频整套系统教程。
最后,我改用 Java8 的日期库修复了 Bug,代码如下:
public static int differentDays(Date date1, Date date2) {if (date1 == null || date2 == null) {throw new RuntimeException("日期不能为空");}LocalDate localDate1 = date2LocalDate(date1);LocalDate localDate2 = date2LocalDate(date2);return Generic.long2int(localDate1.until(localDate2, ChronoUnit.DAYS));}public static LocalDate date2LocalDate(Date date) {Instant instant = date.toInstant();ZoneId zoneId = ZoneId.systemDefault();LocalDate localDate = instant.atZone(zoneId).toLocalDate();return localDate;}
至于补救方式就是统计名单,把发出去但还没有用掉的道具回收,用掉的就当福利,然后再发公告道歉,再送些其他物品弥补。在公众号互联网架构师后台回复:8,可以获取架构师视频整套系统教程。
也幸好补救的及时,要是这些道具收不回来,游戏运营的策略都要大变了,我特么肯定没好果子吃了。
所以千万别在网上复制来路不明的代码乱用,如果真的要用,必须反复测试,否则哪一天突然暴雷有你受的。
猜你喜欢
1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
2、如何才能成为优秀的架构师?
3、从零开始搭建创业公司后台技术栈
4、程序员一般可以从什么平台接私活?
5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6、滴滴业务中台构建实践,首次曝光
7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
8、15张图看懂瞎忙和高效的区别
网上找的一段代码突然爆了,项目出现大Bug!相关推荐
- 求求你!不要在网上乱拷贝代码了!一段网上找的代码突然炸了,项目出现大BUG...
作者:陈宏鸿 链接:https://www.cnblogs.com/aspwebchh/p/12220673.html 作者是做游戏服务器开发的,碰到一个需求,给符某些要求的玩家的发送道具奖励,奖励的 ...
- Python3,仅仅2段代码,就实现项目代码自动上传及部署,再也不需要Jenkins了。
代码自动上传及部署 1.引言 2.代码实战 2.1 模块安装 2.2 实现思路 2.3 代码示例 2.3.1 创建监听器 2.3.2 创建事件处理对象 2.3.3 启动事件监听 2.4 启动运行 3. ...
- 如果说这个世界不是真实存在的,只是一段代码,迄今为止你发现了哪些bug?
知乎上有一个这样的帖子,回答都蛮精彩的,不过有一个特别精彩,不明觉厉的赶脚! 知道的太多了,小心被=NULL啊! http://www.zhihu.com/question/20198823 摘贴 ...
- cad工具箱详细讲解_AutoCAD有哪几类工具箱,各有什么优势?网上找了一下,没有系统讲解,劳驾各位大神啦。...
(princ "\n程序:统计线段长度 命令:te")(defun C:TE (/ CURVE TLEN SS N SUMLEN) (vl-load-com) (setq SUML ...
- git统计每个人的代码行数_项目出了bug如何甩锅?使用这个Git工具帮你找到元凶...
公众号关注 "程序员遇见GitHub" 设为"星标",重磅干货,第一时间送达. 作为程序员,在职场当中经常遇到出现了问题需要定职定责的情况.比如某个系统出现了b ...
- java字符下落,重力球,加速下落减速上弹,重力下落,这段代码是看到网上一个关...
重力球,加速下落减速上弹,重力下落,这段代码是看到网上一个关 这段代码是看到网上一个关于碰壁球修改而成的,用到事件,画图,Timer类package Cheman;import javax.swing ...
- 不要网上乱拷贝代码了!一段网上找的代码突然炸了!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 陈宏鸿 https://www.cnblogs.com/aspwe ...
- 在php里面找出有用的代码,如何在多个源代码文件中 找到某段代码?
有一个网站里面有个图片链接已经失效,并且某明奇妙多出了一些字符. 现在我想在多个源代码文件中php或者数据库中找到这段代码,并且修正. 请问有没有好的方法? 回复内容: 有一个网站里面有个图片链接已经 ...
- 一起来找茬:下面这段代码是让计算机在屏幕上输出“hi”。其中有三个错误,快来改正吧
下面这段代码是让计算机在屏幕上输出"hi".其中有三个错误,快来改正吧 #include <stdio.h> #include <stdlib.h>int ...
- wordpress友联_一段代码开启WordPress友情链接管理
自从WordPress哪个版本开始,默认的后台就没有了链接管理器,而某些主题并不支持友情链接的管理,例如我们现在在用的GeneratePress.所以使用友情链接的时候,绕了一点弯路,使用了自定义HT ...
最新文章
- Hadoop-2.7.4 集群快速搭建
- 香港浸会大学计算机系助理教授招人工智能方向2022年PhD
- java swing图形界面开发 java.swing简介
- 幽默:程序员背后的心酸日常,你懂多少?
- Ubantu install jdk
- es6 SharedArrayBuffer对象
- 【iOS-cocos2d-X 游戏开发之八】使用Lua脚本进行游戏开发(基础篇)
- yapi 权限_YApi
- 如何区分网线是几类的_如何判断网线是几类线?
- Mysql-04-DQL-基础查询-条件查询-模糊查询-UNION和UNION ALL-排序-数量限制-分组查询-子查询
- Python运维之 Flask + 宝塔运行小应用
- JAVA垃圾收集器之Parallel Scavenge收集器
- Object Detection(目标检测神文)(二)
- 职场潜规则之——言及莫论领导是非
- 《Fundamentals Of Computer Graphics》虎书第三版翻译——第五章 线性代数
- ORA-00054 资源正忙
- 17-upstream指令参数
- Slax本土化:移动硬盘上的Linux中文套件(转)
- 韦丹塔和富士康投资200亿美元兴建半导体工厂;精密陶瓷3D打印中日合资企业微瓷公司在景德镇成立 | 美通企业日报...
- oracle no privileges on tablespace 'USERS
热门文章
- Jmeter数据库mysql测试说明
- 互联网创业的准备——数据库:硬盘iops、mysql
- python 模块zlib 压缩与解压
- SQL Server 判定时间是否在某个时间区间内
- ipsec ***之配置详解篇
- 利用SMS轻松实现资产管理,SMS2003系列之四
- linux学习 建立静态库,动态库,写简单的makefile
- Acrobat Pro DC 教程,如何填写并签署 PDF 表格?
- 如何让 Mac 加入网络帐户服务器?
- ios开发之cocoapods导入新三方库报错RuntimeError - [Xcodeproj] Unknown object version.