一个关于int值越界的问题
在一个程序中突然爆出一个时间戳不是按照预设的按照天来增长的,有时间时间戳会跑到以前的一个日期,关于这个时间戳错乱的问题调试了好久,终于发现是int值越界的问题。
原始代码如下:
package test;
public class Test1 {
public static void main(String[] args) {
for (int i = 0; i < 200; ++i ){
long ts = 1L + 3600 * 24 * 1000 * i;
System.out.println(ts);
}
}
}
测试结果如下:
1
86400001
172800001
……..
1814400001
1900800001
1987200001
2073600001
-2134967295
-2048567295
-1962167295
-1875767295
-1789367295
-1702967295
-1616567295
…
从上面的结果可以清晰的看出,int值 3600 * 24 * 1000 * i 会发生越界,因为Java的数字默认是int类型的,最大值为
231−1
所以,当值超过这个最大值事会发生截断,变成一个负值。
Java编译器只会做静态的语法检查,当一个值显示的大于这个最大值时会报错,例如222222222222222222,但是当在计算表达式时,编译器是发现不了越界的,只有在运行的时候发生自动截断。
解决方法,把3600改为3600L即可。