数据类型转换的陷阱

栏目:Java8基础 作者:admin 日期:2015-08-24 评论:1 点击: 2,735 次

本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道: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);
从而可以获得正确的过期时间。

数据类型转换的陷阱:等您坐沙发呢!

发表评论