Java中的Bug分析
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍了Java中的Bug分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的Bug分析文章都会有所收获,下面我们一起来看看吧。背景15年在中信银行做
千家信息网最后更新 2025年11月07日Java中的Bug分析
这篇文章主要介绍了Java中的Bug分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的Bug分析文章都会有所收获,下面我们一起来看看吧。
背景
15年在中信银行做持续集成时,由于当时的项目是基于三方采购的 Java 配置开发平台做的,平台自己基于 Ant 插件实现了增量和热部署。
其中有几个项目在持续集成部署时,经常发现 Linux 平台部署成功后(Windows 不会出现,Linux 也是偶发现象),新版本代码并没有生效(反编译 class)。
起初我是在本地 windows 上跟踪调试基于 Ant 插件的代码,但始终重现不了(最后测试发现 Windows 无此 Bug)。
后来,通过分析代码逻辑,其中有段逻辑是通过文件的最后修改时间(File.lastModified())来判断要不要覆盖部署的,最后通过单测发现,是由于 Java 的 File.lastModified() 方法在 Windows 和 Linux/Unix平台获取的精度不一样导致的,Windows 精度为毫秒,而 Linux/Unix 只能到秒(JDK Bug:JDK-8177809)。
所以也解释了,为什么是偶发现象,文件修改时间如果判断的两个值正好跨秒时,部署就是成功的,否则失败。
Bug 重现
测试代码:FileTest.java
import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.text.SimpleDateFormat;public class FileTest { private static final long LM = 1599276952718L; public static void main(String[] args) throws IOException { // java版本号 System.out.println("Java Version:" + System.getProperty("java.version")); File f = new File("test.txt"); f.createNewFile(); // 设置最后修改时间 f.setLastModified(LM); // 获取修改时间,存在 bug System.out.printf("Test f.lastModified [%s]: %b\n",f.lastModified(), f.lastModified() == LM); // 格式化输出,正确不存在 bug System.out.printf("Test f.lastModified DateFormat [%s]\n",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss").format(f.lastModified())); // Files.getLastModifiedTime() 获取修改时间,同样存在 bug System.out.printf("Test Files.getLastModifiedTime [%s]: %b\n",Files.getLastModifiedTime(f.toPath()).toMillis(),(Files.getLastModifiedTime(f.toPath()).toMillis() == LM)); // 格式化输出,正确不存在 bug System.out.printf("Test Files.getLastModifiedTime DateFormat [%s]\n",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss").format(f.lastModified())); f.delete(); }}命令行下编译、执行:
# 编译执行$ javac FileTest.java && java FileTest
Windows 执行结果
Windows 平台不存在此 Bug。
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_202Test f.lastModified [1599276952718]: trueTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952718]: trueTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
Mac 执行结果
JDK 8 最新版本,目前仍然没有修复该问题。
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_261Test f.lastModified [1599276952000]: falseTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952000]: falseTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
Linux 执行结果
# 编译执行$ javac FileTest.java && java FileTestJava Version:1.8.0_171Test f.lastModified [1599276952000]: falseTest f.lastModified DateFormat [2020-09-05 11:35:52.052]Test Files.getLastModifiedTime [1599276952000]: falseTest Files.getLastModifiedTime DateFormat [2020-09-05 11:35:52.052]
关于"Java中的Bug分析"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Java中的Bug分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
分析
平台
时间
编译
代码
知识
结果
成功
内容
插件
文件
格式
版本
现象
篇文章
精度
逻辑
项目
测试
输出
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网页打不开无法解析服务器地址
澳洲网络安全从业人员工资
魅族下拉 数据库
热点的网络安全密钥在哪
最近的网络安全竞赛
无限低速网络技术
杭州软件开发团队
有关微信网络安全规定
炫主题软件开发
网页制作是属于软件开发吗
java 数据库异常处理
东莞芝麻地网络技术有限公司
论数据中心网络安全攻防
开源ntp服务器 web
手机通话记录软件开发app
材料设备数据库
网络安全和信息化评论员文章
专技天下网官网网络安全生态
okr范文软件开发
网络安全法 绑定
赤子城网络技术有限公司王奎
服务器 开启远程桌面连接
杭州正规网络技术联系方式
华为服务器bmc管理地址
java 数据库异常处理
华为强化网络安全
软件开发注册机
重庆渝中区软件开发机构
如何进入其他的ftp服务器
数据库两个视图可以左连接吗