一个隐形的java int溢出

本文讲述了在一个类SNS项目中,由于未正确处理Java长整型常量而导致的定时器Bug。原本设定为60天的有效期被错误地计算成约10天,造成数据提前丢失。通过调整代码中常量的类型声明,成功解决了这一隐蔽的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

故事的背景:

笔者最近在做一个类SNS的项目,其中使用了MongoDB进行Feed信息存储,并使用定时器删除过期信息。
定时器的时间变量为60天,设定
Java代码 收藏代码
  1. privatelongmsgInvalidDue=60*24*3600*1000;

之所以这么写常量,完全是为了代码的易读易维护。

故事的发生:
在项目上线的某天,突然发现,2周前的数据丢失了,遍历了程序,没发现逻辑问题,甚至开始当心MongoDB造成的数据丢失(业内也是发生过的)。 笔者当时纠结啊~~
但第二天又发现数据的丢失是持续而且有规律的,于是,焦点便集中到了“定时删除任务”。左查右查没发现问题,只能一步一步的进行跟踪调试。。。。

故事的结局:
很难令人想象,问题就出现在msgInvalidDue这个long型常量上。按道理它的值应该是5184000000L的(表示60天的时间),但是它实际值却是 889032704(大约10天时间),why???? 居然是int在计算过程中的溢出~~~~太隐晦的bug了~~正确的写法
Java代码 收藏代码
  1. privatelongmsgInvalidDue=60*24*3600L*1000;

任意一个常量上加L,转long型就OK了,坑爹哇~~~这回真是阴沟里翻船了~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值