zoukankan      html  css  js  c++  java
  • 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类型,接下来开始测试:

     

     

  • 相关阅读:
    关于php,python,javascript文件或者模块导入引入的区别和联系
    es6在网页中模块引入的方法
    pip3 升级失败的解决方法!亲测有效
    php 简单的学习GD库绘制图片并传回给前端实现方式
    session与cookie的区别以及HTML5中WebStorage理解
    二次开发项目集合
    php微信公众号开发入门小教程
    安装运行mariadb时错误:gtid_slave_pos
    发测试 HTML/FILE/MYSQL/动态 20151120
    百度浏览器 自动弹窗!
  • 原文地址:https://www.cnblogs.com/del88/p/13690854.html
Copyright © 2011-2022 走看看