java 数据类型转换遇到的坑

来源:互联网 发布:特高压标准知乎 编辑:程序博客网 时间:2024/06/04 19:44
本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道:System.currentTimeMillis();返回的是long类型的数值。当计算时间相加的时候,如果不注意数据类型的自动转换,则很容易出现问题,如下所示: 
Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365 * 5); 
上面例子本意是求5年后的过期时间,而实际输出的结果却比当前时间还早的时间值。究其原因是Java数值计算过程中发生的溢出。为什么会出现溢出呢?java不是存在数据类型自动转换吗?转换规则如下所示: 
低————————————–>高 
byte,short,char->int->long->float->double 
在运算中,不同类型的数据先转化为同一类型,然后进行运算。虽然java中存在数据类型自动转换,但是需要注意的是:各运算符是有优先级的,乘法的运算优先级要高于加法,因此,java会执行完乘法运算后再执行加法运行。而执行乘法运算时,所有的操作数都是int型,因此没有触发自动类型转换,运算的结果自然是int型的,所以导致1000 * 60 * 60 * 24 * 365 * 5在计算过程中发生溢出。知道了原因就好办了,可以在乘法运算时进行一次强制类型转换: 
Date expiration = new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5); 
从而可以获得正确的过期时间。
0 0
原创粉丝点击