一段网上找的代码突然爆了,项目出现大Bug!

本人是做游戏服务器开发的,碰到一个需求,给符合某些要求的玩家发送道具奖励,奖励的数量根据离线的天数计算。

创新互联建站专注于企业网络营销推广、网站重做改版、榕江网站定制设计、自适应品牌网站建设、H5高端网站建设成都做商城网站、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为榕江等各大城市提供网站开发制作服务。

图片来自 Pexels

这个需求实现起来很简单,只需要在玩家上线的时候计算上次离线时间和当前时间间隔的天数,然后根据策划的算法,计算出道具种类与数量,发一封邮件给玩家就可以了。

计算两个时间间隔天数的函数没有现成的,自己又懒得写,就上谷歌搜了下,选了第一条结果,代码如下:

 
 
 
 
  1. public static int differentDays(Date date1,Date date2) 
  2.     { 
  3.         Calendar cal1 = Calendar.getInstance(); 
  4.         cal1.setTime(date1); 
  5.  
  6.         Calendar cal2 = Calendar.getInstance(); 
  7.         cal2.setTime(date2); 
  8.        int day1= cal1.get(Calendar.DAY_OF_YEAR); 
  9.         int day2 = cal2.get(Calendar.DAY_OF_YEAR); 
  10.  
  11.         int year1 = cal1.get(Calendar.YEAR); 
  12.         int year2 = cal2.get(Calendar.YEAR); 
  13.         if(year1 != year2)   //同一年 
  14.         { 
  15.             int timeDistance = 0 ; 
  16.             for(int i = year1 ; i < year2 ; i ++) 
  17.             { 
  18.                 if(i%4==0 && i%100!=0 || i%400==0)    //闰年             
  19.                 { 
  20.                     timeDistance += 366; 
  21.                 } 
  22.                 else    //不是闰年 
  23.                 { 
  24.                     timeDistance += 365; 
  25.                 } 
  26.             } 
  27.  
  28.             return timeDistance + (day2-day1) ; 
  29.         } 
  30.         else    //不同年 
  31.         { 
  32.             System.out.println("判断day2 - day1 : " + (day2-day1)); 
  33.             return day2-day1; 
  34.         } 
  35.     } 

代码来源:https://www.cnblogs.com/0201zcr/p/5000977.html

把代码复制到项目里,调试下,发现没问题就直接用了,毕竟谷歌结果第一名,放心。

这段代码跑了几个月一直没问题,但是到了 2020-1-1 日那天,有玩家反馈收到了几百封奖励邮件,高兴坏了,但是出于对游戏的热爱,还是通知了运营人员。

运营把 Bug 反馈到服务器这边后我开始排查,百思不得其解的是最近几天都没有更新服务器, 而前几天服务器都稳稳地,怎么突然就出 Bug 了呢?

接下来就是分析玩家数据,结合代码逻辑确定问题所在,最终根据 Bug 的表现排除了所有可能性后,发现唯一可能出问题的地方就是那个网上复制过来的计算天数差的函数。

根据调试发现,这个函数在两个日期参数是不同的年份并且第一个日期大于第二个日期的时候,会返回一个错误的结果,比如:

 
 
 
 
  1. differentDays("2020-1-1","2019-12-25") 

理论上这么调用正确的结果是 -7,但是因为函数有 Bug,调用结果是 358。

于是本来不用发奖励,因为这种特殊情况一下子发出去 358 份,严重影响了游戏某类道具的平衡性。

最后,我改用 Java8 的日期库修复了 Bug,代码如下:

 
 
 
 
  1. public static int differentDays(Date date1, Date date2) { 
  2.         if (date1 == null || date2 == null) { 
  3.             throw new RuntimeException("日期不能为空"); 
  4.         } 
  5.         LocalDate localDate1 = date2LocalDate(date1); 
  6.         LocalDate localDate2 = date2LocalDate(date2); 
  7.         return Generic.long2int(localDate1.until(localDate2, ChronoUnit.DAYS)); 
  8.     } 
  9.  
  10.     public static LocalDate date2LocalDate(Date date) { 
  11.         Instant instant = date.toInstant(); 
  12.         ZoneId zoneId = ZoneId.systemDefault(); 
  13.         LocalDate localDate = instant.atZone(zoneId).toLocalDate(); 
  14.         return localDate; 
  15.     } 

至于补救方式就是统计名单,把发出去但还没有用掉的道具回收,用掉的就当福利,然后再发公告道歉,再送些其他物品弥补。

也幸好补救的及时,要是这些道具收不回来,游戏运营的策略都要大变了,我特么肯定没好果子吃了。

所以千万别在网上复制来路不明的代码乱用,如果真的要用,必须反复测试,否则哪一天突然暴雷有你受的。

分享文章:一段网上找的代码突然爆了,项目出现大Bug!
本文路径:http://www.hantingmc.com/qtweb/news2/309152.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联