`
linliangyi2007
  • 浏览: 1012922 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

一个隐形的java int溢出

阅读更多
故事的背景:

     笔者最近在做一个类SNS的项目,其中使用了MongoDB进行Feed信息存储,并使用定时器删除过期信息。
     定时器的时间变量为60天,设定
     
     private long msgInvalidDue = 60 * 24 * 3600 * 1000;

之所以这么写常量,完全是为了代码的易读易维护。   

故事的发生:
     在项目上线的某天,突然发现,2周前的数据丢失了,遍历了程序,没发现逻辑问题,甚至开始当心MongoDB造成的数据丢失(业内也是发生过的)。 笔者当时纠结啊~~
    但第二天又发现数据的丢失是持续而且有规律的,于是,焦点便集中到了“定时删除任务”。左查右查没发现问题,只能一步一步的进行跟踪调试。。。。

故事的结局:
     很难令人想象,问题就出现在msgInvalidDue这个long型常量上。按道理它的值应该是5184000000L的(表示60天的时间),但是它实际值却是 889032704(大约10天时间),why???? 居然是int在计算过程中的溢出~~~~太隐晦的bug了~~正确的写法
     
     private long msgInvalidDue = 60 * 24 * 3600L * 1000;

任意一个常量上加L,转long型就OK了,坑爹哇~~~这回真是阴沟里翻船了~~
  


    
分享到:
评论
11 楼 lanmingle 2015-05-18  
我不知道你们有没有这样的习惯,如果我写的常量是long的,我必定没有一个都写后缀.
long a = 10L * 100L ...

反正我以前看到书上说自动转型总是会有意想不到的错误,所以我就规范自己.
10 楼 幽蓝星空 2015-01-22  
“任意一个常量上加L”这样总结是有问题的!
60 * 24 * 3600 * 1000=889032704
60 * 24 * 3600L* 1000=5184000000
60 * 24 * 3600 * 1000 * 1L=889032704

因为java中乘法的计算是左结合的!
9 楼 雁行 2013-08-05  

哈哈,我说呢,明明没有超出范围却溢出了
8 楼 looly 2013-06-13  
试验过了,Eclipse里不报错。不过确实是个大坑啊~
7 楼 gezhonglei2007 2012-05-17  
呵呵,这种小问题真的纠结。估计也没有太多人在意数据的范围了!!!推荐一本书,专门罗列类似这种问题、往往又是最基础的东西 的这么一本书——《Java解惑》
6 楼 pppqqq800 2012-02-08  
最近看think in java  发现里面提到了这个问题、。
5 楼 gougou851129 2011-12-30  
这是类型转换的错误 如果不写会先计算成int 然后转成long int的大小还是不够的
4 楼 linliangyi2007 2011-09-30  
store88 写道
不写L的话,ecllipse会报错的


你太自作聪明的,实验一下吧
3 楼 zhengchao860730 2011-09-28  
store88 写道
不写L的话,ecllipse会报错的

好像不会报错。 但是确实会有如此BUG。
2 楼 亦梦亦真 2011-09-06  
store88 写道
不写L的话,ecllipse会报错的

像老师这样的老程序员,应该不是很喜欢用eclipse的
1 楼 store88 2011-08-31  
不写L的话,ecllipse会报错的

相关推荐

    图像隐形水印综述(图象隐形水印,数据隐藏)

    其中,图像隐形水印是数字水印的一个重要分支,它主要应用于图像数据中,能够有效地证明图像的所有权或提供其他附加信息,如版权归属、认证等。本文将重点探讨图像隐形水印的相关知识,包括其基本要求、原理、研究...

    Java实现隐形画图板开发

    在本项目中,"Java实现隐形画图板开发"是一个基于Java编程语言开发的创新工具,它提供了一种独特的方式来进行图像创作。虽然描述部分为空,但我们可以从标题推测,这个“隐形画图板”可能是指一个允许用户在屏幕上...

    采用java实现图片水印

    在IT行业中,图片水印是一种常见的技术...在提供的压缩包文件"WaterMark"中,可能包含一个或多个示例代码,用于演示如何使用Java实现图片水印。这些代码可以作为学习和参考的资源,帮助你更好地理解和应用上述知识点。

    电脑增加一个隐形硬盘

    ### 电脑增加一个隐形硬盘 #### 知识点解析 ##### 隐形硬盘概念 在计算机技术领域,“隐形硬盘”并非一个标准术语,而是一种形象化的说法,指的是通过特定的技术手段,在操作系统层面隐藏或者创建一个虚拟磁盘...

    IP隐形工具

    这种技术通常被称为IP代理或IP旋转,它的工作原理是通过一个中介服务器(即代理服务器)来转发网络请求,而不是直接从用户的设备发出。这样,对外显示的IP地址是代理服务器的,而非用户的实际IP地址,从而达到“隐形...

    图像数字水印的JAVA实现

    在Java中实现图像数字水印涉及到多个关键知识点,包括图像处理、数据编码与解码以及水印算法的选择。下面我们将深入探讨这些核心内容。 1. **图像处理**:在Java中,我们可以使用`java.awt.image`和`javax.imageio`...

    java数字图像水印处理

    在这个基于Eclipse的项目中,开发者利用Java的强大学术和工业支持,构建了一个简单但功能完备的数字水印系统,涵盖了水印的嵌入、提取以及篡改检测等关键功能。 首先,我们要理解数字水印的概念。数字水印是在数字...

    淘宝隐形降权检测

    淘宝隐形降权检测是电商运营中的一个重要概念,尤其对于依赖淘宝平台销售商品的商家来说,了解这一机制至关重要。淘宝为了维护市场公平竞争和消费者权益,会采取一种名为“隐形降权”的措施,针对某些违规或者表现不...

    Java实现的FTP连接与数据浏览程序

    本项目即为一个用Java实现的FTP连接与数据浏览程序,它可以帮助用户方便地查看远程FTP服务器上的文件和目录结构。 首先,这个程序的核心是Java的`java.net`和`java.io`包,它们提供了网络通信和输入/输出的基础支持...

    java为多种文档(word ppt pdf excel)添加文本水印

    Apache POI是Java处理Microsoft Office格式文件的一个开源库,主要用于处理Excel文档。导入`org.apache.poi.ss.usermodel.*`相关类。创建`Workbook`对象,打开Excel文件,获取需要添加水印的工作表。在工作表上创建...

    java开发的屏幕照相机

    在安全性方面,由于Java的沙箱模型,这种软件相对更安全,因为它运行在一个受限的环境中,防止恶意代码对主机系统造成损害。然而,作为屏幕监控工具,隐私和数据保护问题也需重视,开发者应当确保软件遵循相关的法律...

    lenses 隐形眼镜预测数据

    标题 "lenses 隐形眼镜预测数据" 暗示了这是一个与隐形眼镜相关的数据集,用于预测某种特定的属性或结果。描述中的信息简洁,但我们可以从中推测该数据集可能包含了关于隐形眼镜的各类参数,比如度数、材质、舒适度...

    机器学习实战-决策树-隐形眼镜测试数据

    综上所述,《机器学习实战》中隐形眼镜测试数据集为我们提供了一个很好的实践案例,通过对其构建决策树的过程进行分析,不仅可以加深对决策树算法的理解,还能了解到如何将这种算法应用于实际问题中,为医疗健康领域...

    隐形眼镜数据-机器学习

    在IT领域,特别是数据分析和机器学习的实践中,隐形眼镜数据集是一个经常被引用的经典案例。这个数据集主要用于训练和测试机器学习模型,尤其是决策树算法。在这个数据集中,每个样本代表一个患者的隐形眼镜推荐问题...

    电子相册 模板 Flash 隐形的翅膀

    至于“Angell-隐形的翅膀”这个文件名,可能代表着这个模板的设计者或者系列名称,也可能暗示了模板的风格,如天使般的纯净和自由,与“隐形的翅膀”主题相呼应,旨在创造出一种轻盈、优雅的氛围。 总结来说,...

    网神之网络隐形衣 Aeolus

    如果在网络中也有这样一件隐形衣,将自己隐形于网络,岂不就既能尽情地网络冲浪,又不必再为网络安全问题而担忧? 网神之网络隐形衣(以下简称网络隐形衣)就能帮助人们实现这一理想目的。  

    隐形眼镜数据集

    根据给定的信息,“隐形眼镜数据集”主要涉及的是一个决策树的数据集,通过该数据集可以构建决策树模型,用于预测或分类特定情况下适合佩戴何种类型的隐形眼镜(如果有的话)。接下来,我们将从数据集中提取关键信息...

    量子隐形传态中的控制传输

    在量子隐形传态中,通常涉及到三个参与者:发送者Alice、接收者Bob和一个共享量子纠缠对的辅助参与者Charlie。Alice拥有一个未知的量子态,她希望将其传送给Bob。这一过程的关键在于量子纠缠,它是量子力学中的一种...

    隐形文件夹

    "SuperHidden.exe" 可能是一个第三方工具,它提供了更简便的方式来创建和管理隐形文件夹。这样的应用程序通常会提供图形用户界面(GUI),使得设置和访问过程更为直观。可能的功能包括创建隐藏文件夹、设置访问密码...

Global site tag (gtag.js) - Google Analytics