一个隐形的java int溢出
2012-04-24 13:03
127 查看
故事的背景:
笔者最近在做一个类SNS的项目,其中使用了MongoDB进行Feed信息存储,并使用定时器删除过期信息。
定时器的时间变量为60天,设定
Java代码
private long msgInvalidDue = 60 * 24 * 3600 * 1000;
之所以这么写常量,完全是为了代码的易读易维护。
故事的发生:
在项目上线的某天,突然发现,2周前的数据丢失了,遍历了程序,没发现逻辑问题,甚至开始当心MongoDB造成的数据丢失(业内也是发生过的)。 笔者当时纠结啊~~
但第二天又发现数据的丢失是持续而且有规律的,于是,焦点便集中到了“定时删除任务”。左查右查没发现问题,只能一步一步的进行跟踪调试。。。。
故事的结局:
很难令人想象,问题就出现在msgInvalidDue这个long型常量上。按道理它的值应该是5184000000L的(表示60天的时间),但是它实际值却是 889032704(大约10天时间),why???? 居然是int在计算过程中的溢出~~~~太隐晦的bug了~~正确的写法
Java代码
private long msgInvalidDue = 60 * 24 * 3600L * 1000;
任意一个常量上加L,转long型就OK了,坑爹哇~~~这回真是阴沟里翻船了~~
笔者最近在做一个类SNS的项目,其中使用了MongoDB进行Feed信息存储,并使用定时器删除过期信息。
定时器的时间变量为60天,设定
Java代码
private long msgInvalidDue = 60 * 24 * 3600 * 1000;
之所以这么写常量,完全是为了代码的易读易维护。
故事的发生:
在项目上线的某天,突然发现,2周前的数据丢失了,遍历了程序,没发现逻辑问题,甚至开始当心MongoDB造成的数据丢失(业内也是发生过的)。 笔者当时纠结啊~~
但第二天又发现数据的丢失是持续而且有规律的,于是,焦点便集中到了“定时删除任务”。左查右查没发现问题,只能一步一步的进行跟踪调试。。。。
故事的结局:
很难令人想象,问题就出现在msgInvalidDue这个long型常量上。按道理它的值应该是5184000000L的(表示60天的时间),但是它实际值却是 889032704(大约10天时间),why???? 居然是int在计算过程中的溢出~~~~太隐晦的bug了~~正确的写法
Java代码
private long msgInvalidDue = 60 * 24 * 3600L * 1000;
任意一个常量上加L,转long型就OK了,坑爹哇~~~这回真是阴沟里翻船了~~
相关文章推荐
- 【转】一个隐形的java int溢出
- 深入JVM(2): 由一个栈溢出的问题看Java类和对象的初始化
- poj1200【可以溢出,但总有:1)a+b-c==a-c+b;2)a+b+c==(a+b+c)也就是满足两个率。从int范围的那些数字环成一圈来看,往左往右,不管顺序谁先谁后,反正停在同一个地方。】
- 一个坑:java.sql.ResultSet.getInt==》the column value; if the value is SQL NULL, the value returned is 0
- 【提问】有关short和int溢出的一个有趣测试
- JAVA中的hasNextInt()方法多次调用只有一个结果的原因
- Java之深入JVM(4) - 由一个栈溢出的问题看Java类和对象的初始化续
- 使用java将一个int数字进行翻转,例如32输出2
- vsto插件在64位Office的一个异常---算术运算溢出(IntPtr转int)
- java int a,b,c 三个数判断输出最大的一个
- Android Webview 加载一个页面时,报错 java.lang.Throwable: EventHub.removeMessages(int what = 105) is not suppo
- 编写一个JAVA程序,创建指定长度的 int 型数组,并生成 100 以内随机数为数组中的每个元素赋值,然后输出数组
- Reverse Integer - 反转一个int,溢出时返回0
- 一个java堆溢出的小测试
- Java隐晦的int溢出 切忌想当然
- java 一个int数组 长度为100 随机生成100个数 即1-100 将其插入进数组 插入的数字不能重复
- Java键盘输入一个int数组
- 2、 java 已知一个int数组, 编程从数组中获取最大数.
- 在一个java类里,private int a; 什么时候要使用integer
- Java源码中的发现:快速判断一个int值是几位数