求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

Python實戰社群

Java實戰社群

長按識別下方QRCode,按需求添加

掃碼關註添加客服

進Python社群▲

掃碼關註添加客服

進Java社群

作者丨陳宏鴻

https://www.cnblogs.com/aspwebchh/p/12220673.html

本人是做遊戲服務器開發的,碰到一個需求,給符某些要求的玩家的發送道具獎勵,獎勵的數量根據離線的天數計算。

這個需求實現起來很簡單,只需要在玩家上線的時候計算上次離線時間和當前時間間隔的天數,然後根據策劃的算法,計算出道具種類與數量,發一封郵件給玩家就可以了。

計算兩個時間間隔天數的函數沒有現成的,自己又懶得寫,就上Google搜了下,選了第一條結果,代碼如下

publicstaticintdifferentDays(Datedate1,Datedate2){Calendarcal1=Calendar.getInstance();cal1.setTime(date1);Calendarcal2=Calendar.getInstance();cal2.setTime(date2);intday1=cal1.get(Calendar.DAY_OF_YEAR);intday2=cal2.get(Calendar.DAY_OF_YEAR);intyear1=cal1.get(Calendar.YEAR);intyear2=cal2.get(Calendar.YEAR);if(year1!=year2)//同一年{inttimeDistance=0;for(inti=year1;i<year2;i++){if(i%4==0&&i%100!=0||i%400==0)//閏年{timeDistance+=366;}else//不是閏年{timeDistance+=365;}}returntimeDistance+(day2-day1);}else//不同年{System.out.println("判斷day2-day1:"+(day2-day1));returnday2-day1;}}

代碼來源:https://www.cnblogs.com/0201zcr/p/5000977.html

把代碼復制到項目裡,調試下,發現沒問題就直接用了,畢竟Google結果第一名,放心。

這段代碼跑了幾個月一直沒問題,但是到了2020-1-1日那天,有玩家反饋收到了幾百封獎勵郵件,高興壞了,但是出於對遊戲的熱愛,還是通知了運營人員。

運營把bug反饋到服務器這邊後我開始排查,百思不得其解的是最近幾天都沒有更新服務器, 而前幾天服務器都穩穩地,怎麼突然就出BUG了呢。

接下來就是分析玩家數據,結合代碼邏輯確定問題所在,最終根據BUG的表現排除了所有可能性後,發現唯一可能出問題的地方就是那個網上復制過來的計算天數差的函數。

根據調試發現,這個函數在兩個日期參數是不同的年份並且第一個日期大於第二個日期的時候,會返回一個錯誤的結果

比如

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

理論上這麼調用正確的結果是 -7,但是因為函數有bug,調用結果是 358

於是本來不用發獎勵,因為這種特殊情況一下子發出去358份,嚴重影響了遊戲某類道具的平衡性。

至於補救方式就是統計名單,把發出去但還沒有用掉的道具回收,用掉的就當福利,然後再發公告道歉,再送些其他物品彌補。

也幸好補救的及時,要是這些道具收不回來,遊戲運營的策略都要大變了,我特麼肯定沒好果子吃了。

所以千萬別在網上復制來路不明的代碼亂用,如果真的要用,必須反覆測試,否則哪一天突然暴雷有你受的。

改用Java8的日期庫修復了BUG

publicstaticintdifferentDays(Datedate1,Datedate2){if(date1==null||date2==null){thrownewRuntimeException("日期不能為空");}LocalDatelocalDate1=date2LocalDate(date1);LocalDatelocalDate2=date2LocalDate(date2);returnGeneric.long2int(localDate1.until(localDate2,ChronoUnit.DAYS));}publicstaticLocalDatedate2LocalDate(Datedate){Instantinstant=date.toInstant();ZoneIdzoneId=ZoneId.systemDefault();LocalDatelocalDate=instant.atZone(zoneId).toLocalDate();returnlocalDate;}

知乎:https://www.zhihu.com/people/aspwebchh

github:https://github.com/aspwebchh

email:mailto:[email protected]

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第3張

程序員專欄

掃碼關註填加客服

長按識別下方QRCode進群

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第4張

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第5張

近期精彩內容推薦:

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第6張

10號和20號發薪水的公司,區別竟然這麼大?

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第6張

美女裸聊一時爽,裸聊結束火葬場!

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第8張

使用IntelliJ IDEA查看類圖,內容極度舒適

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第6張

Pycharm IDEA破解漢化插件帶你一文打盡!

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第10張

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第11張

在看點這裡

求求你!不要在網上亂複製代碼了!一段網上找的代碼突然炸了,項目出現大BUG 家居 第12張

好文分享給更多人↓↓

預覽時標簽不可點