一個隱形的java int溢出

來源:互聯網
上載者:User

故事的背景: 

     筆者最近在做一個類SNS的項目,其中使用了MongoDB進行Feed資訊儲存,並使用定時器刪除到期資訊。 
     定時器的時間變數為60天,設定 
Java代碼  

  1. private long msgInvalidDue = 60 * 24 * 3600 * 1000;  


之所以這麼寫常量,完全是為了代碼的易讀易維護。    

故事的發生: 
     在項目上線的某天,突然發現,2周前的資料丟失了,遍曆了程式,沒發現邏輯問題,甚至開始當心MongoDB造成的資料丟失(業內也是發生過的)。 筆者當時糾結啊~~ 
    但第二天又探索資料的丟失是持續而且有規律的,於是,焦點便集中到了“定時刪除任務”。左查右查沒發現問題,只能一步一步的進行跟蹤調試。。。。 

故事的結局: 
     很難令人想象,問題就出現在msgInvalidDue這個long型常量上。按道理它的值應該是5184000000L的(表示60天的時間),但是它實際值卻是 889032704(大約10天時間),why???? 居然是int在計算過程中的溢出~~~~太隱晦的bug了~~正確的寫法 
Java代碼  

  1. private long msgInvalidDue = 60 * 24 * 3600L * 1000;  


任意一個常量上加L,轉long型就OK了,坑爹哇~~~這回真是陰溝裡翻船了~~ 
   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.