日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
一段網上找的代碼突然爆了,項目出現大Bug!

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

創(chuàng)新互聯建站專注于企業(yè)網絡營銷推廣、網站重做改版、榕江網站定制設計、自適應品牌網站建設、H5高端網站建設成都做商城網站、集團公司官網建設、外貿網站制作、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為榕江等各大城市提供網站開發(fā)制作服務。

圖片來自 Pexels

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

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

 
 
 
 
  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

把代碼復制到項目里,調試下,發(fā)現沒問題就直接用了,畢竟谷歌結果第一名,放心。

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

運營把 Bug 反饋到服務器這邊后我開始排查,百思不得其解的是最近幾天都沒有更新服務器, 而前幾天服務器都穩(wěn)穩(wěn)地,怎么突然就出 Bug 了呢?

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

根據調試發(fā)現,這個函數在兩個日期參數是不同的年份并且第一個日期大于第二個日期的時候,會返回一個錯誤的結果,比如:

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

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

于是本來不用發(fā)獎勵,因為這種特殊情況一下子發(fā)出去 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.     } 

至于補救方式就是統(tǒng)計名單,把發(fā)出去但還沒有用掉的道具回收,用掉的就當福利,然后再發(fā)公告道歉,再送些其他物品彌補。

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

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


網站欄目:一段網上找的代碼突然爆了,項目出現大Bug!
網頁網址:http://m.5511xx.com/article/ccdsjss.html