Java 数字 默认是 Integer类型的问题,System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000)的问题,剖析、Long + Integer的问题
最终结论:
(180 * 24 * 60 * 60) 这种计算表达式在 Java中是默认以 Integer类型来的,若不超过 Integer的最大值则没有问题,若超过则必须用 (180 * 24 * 60 * 60 * 1000L) 这种加L的方式来。
当然为了避免出现此类问题,也可以采用最粗暴的方法,就是不管 表达式的计算结果是否超过了 Integer的最大值,都用 L来标识 是个 Long类型,这样绝对不会出错。若是一眼就能计算出来的
可以不用加L,比如:(8 * 24 * 32) 基本肯定不会超过 Integer的最大值不用加L也行,若是一眼计算不出来感觉很大的如:(180 * 24 * 500 * 24) 这种一眼计算不出来,且感觉会超过 Integer的最大值的
需要加L来标识 计算出来的结果是一个Long类型,以防止溢出Bug.
举例:
System.currentTimeMillis() + (24 * 60 * 60 * 1000) 这样是不会出错的,因为表达式的结果没有超过 Integer,long + integer 是没有问题的。
System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000); 这样就会出错,因为表达式的结果已经超过了 Integer,结果溢出了,表达式的计算结果变成了负数,导致 long - integer,最终导致计算出来的 数值 反而变小。
public class TestMain3 {
public static void main(String[] args) {
Long now = System.currentTimeMillis();
System.out.println("当前时间戳:" + now);
//当表达式的计算结果,小于 Integer的最大值时,加L与不加L都没有问题,效果一样
System.out.println("180 * 24 * 60 * 60: " + (180 * 24 * 60 * 60));
System.out.println("180 * 24 * 60 * 60L: " + (180 * 24 * 60 * 60L));
System.out.println(now + (180 * 24 * 60 * 60));
System.out.println(now + (180 * 24 * 60 * 60L));
//当表达式的计算结果,大于 Integer的最大值时,由于 溢出了会变成负数,所以最终的结果反而会变小
System.out.println("180 * 24 * 60 * 60 * 1000: " + (180 * 24 * 60 * 60 * 1000));
System.out.println("180 * 24 * 60 * 60 * 1000L: " + (180 * 24 * 60 * 60 * 1000L));
System.out.println(now + (180 * 24 * 60 * 60 * 1000) + "(这里变小了,引起Bug)");
System.out.println(now + (180 * 24 * 60 * 60 * 1000L));
}
}

==================================================================================================================================================
今天黄克说我生成的Token老是会过期,我郁闷,检查了一下代码 发现:

心想难道 (180 * 24 * 60 * 60 * 1000)这一串默认是 Integer类型,接下来开始测试:




Java 数字 默认是 Integer类型的问题,System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000)的问题,剖析、Long + Integer的问题的更多相关文章
- Java进阶(十六)使用new Date()和System.currentTimeMillis()获取当前时间戳
java使用new Date()和System.currentTimeMillis()获取当前时间戳 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可 ...
- java中两个Integer类型的值相比较的问题
今天在做一个算法时,由于为了和其他人保持接口的数据类型一致,就把之前的int换为Integer,前几天测了几组数据,和之前的结果一样,但是今天在测其它数据 的时候,突然出现了一个奇怪的bug,由于之前 ...
- Java的八种基本类型:(按字节来分)
Java的八种基本类型:(按字节来分) boolean 布尔型 1个字节 8bit(8位) byte 字节类型 1个字节 char 字符类型 2个字节 short ...
- java和数据库中日期类型的常见用法
(1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换: SimpleDateFormat类方法: format ...
- java基本数据类型与封装类型详解(int和Integer区别)
int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...
- java对象中含有Integer类型字段转json字符串问题
问题:对于含有Integer类型字段的java对象,在通过下面这种方式转为json字符串时,Integer类型的字段如果为空的情况下,会默认转化为0,但是我想让它为空的时候直接转化为null,不要默认 ...
- Java判断Integer类型的值是否相等
我们知道Integer是int的包装类,在jdk1.5以上,可以实现自动装箱拆箱,就是jdk里面会自动帮我们转换,不需要我们手动去强转,所以我们经常在这两种类型中随意写,平时也没什么注意 但Integ ...
- Java中Integer类型的整数值的大小比较
如果比较两个数值相等的Integer类型的整数,我们可能会发现,用"=="比较(首先你必须明确"=="比较的是地址),有的时候返回true,而有的时候,返回fa ...
- 转:JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...
- JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...
随机推荐
- 01-UPF介绍
Mainstream Low Power techniques clock gating - 低功耗的设计风格,4bit以上可以通过综合工具增加ICG APR的时候可以更换器件VT Advanced ...
- 02-python简介
python简介 python认知 1.python简介 89年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido). python具有非常多并且强大的第三方库,使 ...
- 【Gerrit】操作技巧
多笔提交依赖 1. cherry-pick 同步的多笔代码前后有依赖,如第M笔提交是基于第N笔修改的,直接同步过去会有冲突,所以同步M笔提交时需要基于N笔提交,即写入第N笔commit-id 上述填的 ...
- 【SHELL】获取脚本输入参数
参数获取 EXEC_PARAMS=(${@:index}) 示例 ./do.sh test a b c d e f EXEC_PARAMS=(${@:0}) ./do.sh test a b c d ...
- 【mysql】 解决 auto_increment 字段 Column count doesn't match value count at row 1
1, 表结构 man +-------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PR ...
- JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素
一,首先介绍下 js Array对象 中的 splice 方法 . ( splice在英文中是剪接的意思 ) 1,定义和用法 splice() 方法用于插入.删除或替换数组的元素. 注意:这种方法会改 ...
- Laravel - 控制器的session ( 转载 )
设置路由 //使用session,需要开启session,//session的开始类在/app/Kernel下//protected $middlewareGroups = [// 'web' =&g ...
- Laravel - blade 模板继承的使用
1. 模板文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- Android——SQLiteOpenHelper
使用步骤: 新建一个继承自SQLiteOpenHelper的数据库操作类,提示重写onCreate和OnUpgraed两个方法.其中,onCreate方法只在第一次打开数据库时执行,在此可进行表结构创 ...
- K8s集群CoreDNS监控告警最佳实践
本文分享自华为云社区<K8s集群CoreDNS监控告警最佳实践>,作者:可以交个朋友. 一 背景 coreDNS作为K8s集群中的关键组成部分.主要负责k8s集群中的服务发现,域名解析等功 ...