问题
在工作中碰到一件奇怪的事,下面的代码计算有问题,计算时间老是少一大截。
代码如下:
1 2 3 4 5 6 7 8 9 |
/** * 获取 重置 RefreshToken token 的有效期 * @param refreshTokenExpiresIn * @return */ public Date getResetRefreshTokenExpiresTime(Integer refreshTokenExpiresIn) { long refreshTokenExpiresTime=System.currentTimeMillis()+(refreshTokenExpiresIn)*1000; return new Date(refreshTokenExpiresTime); } |
解决
代码看起来没问题,但是 System.currentTimeMillis()+(refreshTokenExpiresIn)*1000 在 refreshTokenExpiresIn太大的时候会造成int 越界,又被转成了long 从而导致计算有问题。
这种问题编译器不会提示的,所以我们在写代码的时候,必须警惕该类问题,尤其涉及 int*int 转成long类型的时候。
单独的int*int java在运行时会报错的,但是在涉及int*int 再转成long 的计算表达式中,java会自动截断,不会提示任何错误.
正确的写法
1 2 3 4 5 6 7 8 9 10 |
/** * 获取 重置 RefreshToken token 的有效期 * @param refreshTokenExpiresIn * @return */ public Date getResetRefreshTokenExpiresTime(Integer refreshTokenExpiresIn) { Long refreshTokenExpiresInLong=Long.valueOf(refreshTokenExpiresIn); long refreshTokenExpiresTime=System.currentTimeMillis()+(refreshTokenExpiresInLong)*1000L; return new Date(refreshTokenExpiresTime); } |