线上问题排查-int类型的溢出问题

简介: 线上问题排查-int类型的溢出问题

一 场景

系统:xx系统\
功能界面:【xxx】\
功能按钮:直接打印\
单号:xxx
问题描述:用户反馈2021/09/07 15:15打印时,系统弹框提示“修改报文已发送,
发送时间未超过10分钟,请10分钟后操作”,实际修改报文是2021-08-13 14:24发送的,完全超过了10分钟,为什么还提示

二 分析

定位代码

    /**
     * 修改报文只检验发送时间
     *
     * @param eirSendList
     * @return
     */
    private String checkEirEmAlterSend(List<InboundEirSend> eirSendList) {
        StringBuilder result = new StringBuilder();
        StringBuilder checkTime = new StringBuilder("以下箱号修改报文已发送,发送时间未超过10分钟,请10分钟后操作:");
        boolean isCheckTime = false;
        for (InboundEirSend entity : eirSendList) {
            int sendStatus = entity.getSendStatus();
            if (sendStatus == 0) {
                continue;
            }
            Date sendTime = entity.getSendTime();
            boolean isMore = eirSendUtilService.isMoreTimeToNow(sendTime, 10);
            if (isMore) {
                isCheckTime = true;
                checkTime.append(entity.getCtnNo()).append(COMMA);
            }
        }
        if (isCheckTime) {
            result.append(eirSendUtilService.subStringValue(checkTime)).append(SEMICOLON);
        }
        return result.toString();
    }

时间判断代码

    /**
     * 比较时间和当前时间差值 是否在moreminute 内
     *
     * @param targetDate
     * @param moreMinute
     * @return
     */
    public boolean isMoreTimeToNow(Date targetDate, int moreMinute) {
        boolean result = false;
        if (targetDate == null) {
            return result;
        }
        long diffMilliseconds = System.currentTimeMillis() - targetDate.getTime();
        int diffMin = (int) diffMilliseconds / 60000;
        if (diffMin < moreMinute) {
            result = true;
        }
        return result;
    }

看上去并没有问题,找了产品确认几次,的确存在这样的问题,于是自己写了一个测试代码,复原了当时生产时的时间,发现的确存在问题

  int diffMin = (int) diffMilliseconds / 60000;
  

执行后,居然出现了负数,导致

    if (diffMin < moreMinute) {
        result = true;
    }

result 为true,导致了问题的产生,那么为什么会产生负数呢?

原来是int类型溢出问题,我们看下int类型的区间

-2147483648——2147483647;
如果超出这个区间就会出现溢出问题,因为一个数据类型的最大值和最小值是一个循环,也就是说在最大值的基础上再扩大数值或者在最小值的基础上再缩小数值,会跳到相反的最值上面。
这就解释了为什么会出现负数。
最后修改为不通过int类型而通过long类型解决了这个问题

public boolean isMoreTimeToNow(Date targetDate, long moreMinute) {
    boolean result = false;
    if (targetDate == null) {
        return result;
    }
    long diffMilliseconds = System.currentTimeMillis() - targetDate.getTime();
    long diffMin = diffMilliseconds / 60000;
    if (diffMin < moreMinute) {
        result = true;
    }
    return result;
}

long类型的区间为 -9223372036854775808——9223372036854775807 满足业务需求

三 结语

这次问题的排查,得到的启示就是,对于可能存再的问题代码,自己一定要亲自去测,自己亲自去写,这样才能更好地排查出问题。

相关文章
|
数据采集 分布式计算 数据处理
Dataphin常见问题之与指定类型int不兼容如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
338 3
|
9月前
|
Python Windows
[oeasy]python076_int这个词怎么来的_[词根溯源]整数类型_int_integer_touch
本文探讨了“int”一词的起源及其与整数类型的关联。通过词根溯源,揭示“int”来源于“integer”,意为“完整的数”,与零碎的分数相对。同时分析了相关词汇如“tact”(接触)、“touch”(触摸)及衍生词,如“tangential”(切线的)、“intagible”(无形的)和“integral”(完整的、不可或缺的)。文章还结合编程语言特性,解释了Python作为动态类型、强类型语言的特点,并总结了整型变量的概念与意义。最后预告了后续内容,提供了学习资源链接。
321 11
|
9月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
204 1
|
Python
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
141 3
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
JSON 小程序 JavaScript
小程序根据返回值的int类型渲染不同的状态
小程序根据返回值的int类型渲染不同的状态
217 0
|
自然语言处理 Go 数据安全/隐私保护
对 int 类型的数据加密,有哪些好的方案?
对 int 类型的数据加密,有哪些好的方案?
221 13
|
Java
【Java用法】Java中String类型和int类型互转的所有方法
【Java用法】Java中String类型和int类型互转的所有方法
514 0
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之int类型是否可以为raw feature
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。

热门文章

最新文章