Java中的Bug分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了Java中的Bug分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的Bug分析文章都会有所收获,下面我们一起来看看吧。背景15年在中信银行做
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
上海喔噻互联网科技有限公司
北京互联网科技有限公司
深圳互联网络科技有限公司
碳银互联网科技
易通互联网络科技有限公司
米客互联网科技
四川狮子座互联网科技
金融科技和互联网金融
互联网汽车科技小镇
宁波青枫互联网科技有限公司
互联网科技实习生岗位职责
哈尔滨屹滨互联网科技有限公司
996高科技互联网公司
美国互联网科技实力
深圳互联网科技的发展
互联网与数字科技关系
互联网界的黑科技
长沙渺峰互联网科技有限公司
广西泛欧互联网科技有限公司
互联网科技大会大佬
互联网新科技
云信互联网科技有限公司
紫鲸互联网科技
广州宏创互联网科技
互联网科技大会
上海卓越科技 互联网
温州喔噻互联网科技有限公司
互联网企业和科技型企业
山东有哪些互联网科技公司
山东亿川互联网科技有限责任公司