编译时不好的注释会让代码丢失并产生问题

news2024/12/24 20:52:32

  

写在之前

这篇文章是上一篇文章的后续事件,记录的事情也挺有意思。想看事情如何开始的点击链接

频繁GC引起卡顿问题排查与解决


进入正题

不知道有没有人遇到过编译后部分代码缺失呢?反正我遇到了, 上一篇文章提到了因为开发人员写了死循环造成系统卡死。问题代码如下,此方法缺少tempStart.add(calendarField, 1)变成了死循环

    --startTime1开始时间
    --endTime1 截止时间
    --开发人员写了一个方法获取两个时间的中间天数 - -# 大致代码如下
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    int calendarField=Calendar.DAY_OF_MONTH;
    Calendar tempStart = Calendar.getInstance();
	tempStart.setTime(startTime1);
	while (endTime1.getTime() >= startTime1.getTime()) {
		dateList.add(format.format(startTime1));
		tempStart.add(calendarField, 1);  //没有此行时候死循环
		startTime1 = tempStart.getTime();
    }

起初,我以为本事故只是开发人员漏提交了代码引起的偶然事情,然而并不是如此。 我再三确认代码库里已经提交了tempStart.add(calendarField, 1) 并非死循环后重新构建并请测试组继续验证。结果同样的问题又出现了。使用Arthas反编译后发现又是之前的问题,因缺少tempStart.add(calendarField, 1)造成死循环。


/*274*/         Calendar tempStart = Calendar.getInstance();
/*275*/         tempStart.setTime(startTime1);
                while (endTime1.getTime() >= startTime1.getTime()) {
/*277*/             dateList.add(format.format(startTime1));
/*279*/             startTime1 = tempStart.getTime();
                }

经过反复确认测试环境使用的包无问题,甚至自己重新使用jenkins构建并反编译确认。结果:代码库里有tempStart.add(calendarField, 1)代码, 但是构建后的程序包反编译没有tempStart.add(calendarField, 1)。 这种诡异事情还真我遇到了

提交的代码

 编译后的代码

世界真精彩!

我开始以为是编译问题,此工程编译使用的是1.6,我写了一个测试类来验证我的想法,参考代码如下

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		try {
			List<String> dateList = new ArrayList<String>();
			SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
			int calendarField=Calendar.DAY_OF_MONTH;
			
			String startTime = "20230420";
			String endTime = "2023042601";
			Date startTime1 = format.parse(startTime);
			Date endTime1 = format.parse(endTime.substring(0,startTime.length()));
			Calendar tempStart = Calendar.getInstance();
			tempStart.setTime(startTime1);
			System.out.println("first"+startTime1);
			while (endTime1.getTime() >= startTime1.getTime()) {
				dateList.add(format.format(startTime1));
				tempStart.add(calendarField, 1);
				startTime1 = tempStart.getTime();
			}
		} catch (Exception e) {
//	        log.error(e);
		}
	}
}

分别使用1.6和1.8和17编译

D:\>javac Test1.java

D:\>

编译后反编译class发现1.6,1.8,17处理结果相同,而 localCalendar.add(i, 1)代码正常

public class Test1
{
  public static void main(String[] paramArrayOfString)
  {
    try
    {
      java.util.ArrayList localArrayList = new java.util.ArrayList();
      java.text.SimpleDateFormat localSimpleDateFormat = new java.text.SimpleDateFormat("yyyyMMdd");
      int i = 5;
      
      String str1 = "20230420";
      String str2 = "2023042601";
      java.util.Date localDate1 = localSimpleDateFormat.parse(str1);
      java.util.Date localDate2 = localSimpleDateFormat.parse(str2.substring(0, str1.length()));
      java.util.Calendar localCalendar = java.util.Calendar.getInstance();
      localCalendar.setTime(localDate1);
      System.out.println("first" + localDate1);
      while (localDate2.getTime() >= localDate1.getTime()) {
        localArrayList.add(localSimpleDateFormat.format(localDate1));
        localCalendar.add(i, 1);
        localDate1 = localCalendar.getTime();
      }
    }
    catch (Exception localException) {}
  }
}

从网上也搜了搜,但没有同学遇到类似问题,也没有相应的文章。还好在排查问题过程中发现java类提交的时候使用的是utf-8  ,我就怀疑是不是编码格式问题, 从代码库里拷贝出问题源文件,然后修改成测试类,下载后发现因为java类是UTF-8提交的代码。中文已经变成了乱码

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		try {
			List<String> dateList = new ArrayList<String>();
			SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
			int calendarField=Calendar.DAY_OF_MONTH;
			
			String startTime = "20230420";
			String endTime = "2023042601";
			Date startTime1 = format.parse(startTime);
			Date endTime1 = format.parse(endTime.substring(0,startTime.length()));
			Calendar tempStart = Calendar.getInstance();
			tempStart.setTime(startTime1);
			System.out.println("first"+startTime1);
			while (endTime1.getTime() >= startTime1.getTime()) {
				dateList.add(format.format(startTime1));
				//鏈夊绉嶆ā寮忓彲浠ュ鍔犳垨鍑忓幓鐩稿簲鐨勬椂闂�
				tempStart.add(calendarField, 1);
				startTime1 = tempStart.getTime();
			}
		} catch (Exception e) {
//	        log.error(e);
		}
	}
}

编译测试时发现编译警告,并且在警告后有丢失的代码信息。如下

D:\>javac Test.java
Test.java:28: 警告:编码 GBK 的不可映射字符
 //閺堝顧嬬粔宥喣佸蹇撳讲娴犮儱顤冮崝鐘冲灗閸戝繐骞撻惄绋跨安閻ㄥ嫭妞傞梻锟? tempStart.add(calendarField, 1);
                                                                        ^
1 警告

再将Test.class反编译,发现tempStart.add(calendarField, 1)这条命令丢失了

从现象上看乱码后的1行代码被当做了乱码信息

package com.star.sms.business.customer.job;

import java.io.PrintStream;
import java.util.List;

public class Test
{
  public static void main(String[] paramArrayOfString)
  {
    try
    {
      java.util.ArrayList localArrayList = new java.util.ArrayList();
      java.text.SimpleDateFormat localSimpleDateFormat = new java.text.SimpleDateFormat("yyyyMMdd");
      int i = 5;
      
      String str1 = "20230420";
      String str2 = "2023042601";
      java.util.Date localDate1 = localSimpleDateFormat.parse(str1);
      java.util.Date localDate2 = localSimpleDateFormat.parse(str2.substring(0, str1.length()));
      java.util.Calendar localCalendar = java.util.Calendar.getInstance();
      localCalendar.setTime(localDate1);
      System.out.println("first" + localDate1);
      while (localDate2.getTime() >= localDate1.getTime()) {
        localArrayList.add(localSimpleDateFormat.format(localDate1));
        
        localDate1 = localCalendar.getTime();
      }
    }
    catch (Exception localException) {}
  }
}

故事结尾

本问题是由于注释乱码引起了编译错误,开发过程中以下两点十分重要

1)开发人员都希望别人多写注释,那么自己写注释时,必须注意乱码问题

2)特殊符号使用国际化文件,这样可以有效的避免乱码


上一篇:频繁GC引起卡顿问题排查与解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装mysql8.0文档

第一步需要安装Docker基础环境&#xff0c;具体可以看看这篇 docker基础篇 第二步&#xff0c;拉取mysql8.0的镜像 docker pull mysql:8.0 第三步&#xff0c;镜像启动和文件挂载 复制下面命令执行&#xff0c;33006是对外访问暴露的端口&#xff0c;当然你也可以设置为3306…

【Hello Network】HTTP协议

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;较为详细的介绍HTTP协议 HTTP协议 HTTP协议HTTP协议概念URL概念urlencode和urldecodeHTTP协议格式HTTP请求协议格式HTTP响应格式 HTTP的方法HTTP状态…

04-26 每日一题 1031. 两个非重叠子数组的最大和 学习反思

1031. 两个非重叠子数组的最大和 类似问题转换 考虑一个问题&#xff0c;如何求得数组中两个数的最大和。 可以固定一个数&#xff0c;然后向右遍历如下&#xff0c;可以求得目标数组中两个数的最大和为 15 把思路实现为代码 实现过程&#xff0c;如上图所示过程&#xff0…

【汽车品牌案例02-设置右侧索引 Objective-C语言】

一、刚才我们说了一下,如何把那个汽车品牌加载起来,我们使用了一个模型的嵌套,以及我们在创建单元格的时候,是不是指定了一个,单元格的可重用ID吧, 1.根据重用ID来创建单元格,那么我们运行的时候,已经能把这个大致的效果做出来了, 大致就是这么一个效果, 接下来,还…

SPI机制源码解析

概念 SPI&#xff08;service provider interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制。是一种动态替换发现机制&#xff0c;比如有个接口&#xff0c;想在运行时动态地给它添件实现&#xff0c;只需要添加一个实现。 然后在META-INF/services目录创建一…

树莓派+摄像头:mjpg-streamer实现监控功能的配置及调试

目录 一 树莓派摄像头安装 二 配置mjpg-streamer ① 说明 ② 配置 <1> 配置前需要安装的工具包 <2> 下载安装mjpg-streamer源码到树莓 <3> 进入下载目录的路径 <4> 输入指令编译&#xff1a;make all <5> 安装指令&#xff1a;…

任务调度原理 通俗详解(FreeRTOS)

寄存器说明 以cortex-M3&#xff0c;首先先要了解比较特别的几个寄存器&#xff1a; r15 PC程序计数器&#xff08;Program Counter&#xff09;,存储下一条要执行的指令的地址。 r14 LR连接寄存器&#xff08;Link Register &#xff09;&#xff0c;保存函数返回地址&#x…

【操作系统】第一章

文章目录 &#x1f337; 一、操作系统的概念1、定义2、功能 和 目标 &#x1f337; 二、操作系统的特征1、**并发**2、 **共享**3、 **虚拟**4、 **不确定性** &#x1f337; 三、操作系统的发展与分类1、 手工操作阶段2、 批处理阶段3、 分时操作系统4、 实时操作系统5、 网络…

servlet技术

功能 对客户端发送的数据进行读取和拦截读取客户端请求的隐含数据运行结果或者生成结果发送响应的数据 Servlet技术特点 高效率 Servlet本身就是一个Java类&#xff0c;在运行的时候位于同一个Java虚拟机中&#xff0c;可以快速地响应客户 端的请求并生成结果。在Wb服务器…

停用词(stop words)+TF-IDF实现

一、什么是停用词&#xff1f; 在汉语中&#xff0c;有一类没有实际意义的词语&#xff0c;比如组词“的”&#xff0c;连词“以及”&#xff0c;副词“甚至”&#xff0c;语气词“吧”&#xff0c;被称为停用词。一个句子去掉这些停用词&#xff0c;并不影响理解。所以&#…

资产管理系统

目录 1、资产管理模块 资产入库 ​编辑 闲置资产分配 资产调配 资产回收 资产报废 车辆维修 2、资产设置模块 资产标准规格 资产分类 3、资产报表模块 全部资产报表 已分配资产报表 资产分类报表 到期资产报表 机构资产报表 资产折旧报表 机构分类报表 资产…

〖ChatGPT实践指南 - 零基础扫盲篇⑤〗- OpenAI API 演示 Demo 之宠物名字生成器

文章目录 ⭐ 运行 Demo应用 - 宠物名字生成器&#x1f31f; 安装 - node.js&#x1f31f; 利用 git 下载 Demo应用 - 宠物名字成器&#x1f31f; 添加 API 秘钥&#x1f31f; 安装依赖并运行Demo应用 - 宠物名字成器 ⭐ 访问并测试 Demo应用 - 宠物名字成器 在上一章节&#xf…

最新版TensorFlow的GPU版本不支持原生Windows系统(大坑预警)

一、前言 首先需要说明&#xff0c;按照官方中文文档安装是无法正常检测到GPU的。因为TensorFlow 2.10是支持原生Windows系统GPU环境的最后版本&#xff0c;默认安装的版本都比较高。 中文文档没有说明&#xff0c;英文文档是有提到的&#xff1a; &#xff08;我在GitHub上找…

PostgreSQL-布尔类型

布尔类型 boolean的值要么是true&#xff0c;要么是false&#xff0c;如果是unknown状态&#xff0c;用NULL表示。 boolean在SQL中可以用不带引号的TRUE或FALSE表示&#xff0c;也可以用其他表示“真”和“假”的带引号字符表示&#xff0c;如true、false、yes、no等等。 cr…

操作系统之进程同步和互斥

目录 什么是进程同步和进程互斥 进程互斥的软件实现方法 进程互斥的硬件实现方法 互斥锁 信号量机制 用信号量实现进程互斥和同步 生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 管程 死锁 什么是进程同步和进程互斥 进程同步 进…

【Golang开发入门】一篇文章弄懂:值类型、指针类型

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 目录 一、前言…

【数据分析之道-Pandas(二)】DataFrame

文章目录 专栏导读1、DataFrame简介2、DataFrame创建2.1字典创建DataFrame2.2列表创建DataFrame2.3ndarrays 创建DataFrame2.4CSV文件创建DataFrame 3、DataFrame基本操作3.1添加列3.2删除列 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&…

什么是 TDSQL-C MySQL版 ---- 数据库开发者视角

我们从设计演化的角度来讲什么是 TDSQL-C MySQL 版本。 首先&#xff0c;我们有了一个纯净版 MySQL。它是一个单机数据库。存算分离&#xff1a;然后&#xff0c;我们把 MySQL 的存储引擎拿掉&#xff0c;换成云存储。这就成了存算分离。这时&#xff0c;在用户看来它还是一个…

测牛学堂:2023软件测试入门系列(软件测试方法之流程分析法)

流程分析法 流程就是用户为了完成一定的业务目的&#xff0c;需要进行的一系列的操作。 流程分析法又叫场景分析法&#xff0c;是编写测试用例最常用的方法之一。 流程分析法不校验单个功能点的正确性&#xff0c;只关心流程能不能走通。 流程分类的几个概念 场景&#xff1…

Arduno ESP8266接入中移OneNet动态显示实时数据

Arduno ESP8266接入中移OneNet动态显示实时上传数据 ✨本案例基于HTTP协议. 🌼网页查看动态数据: 📓Onenet产品创建 从全部产品服务点击进入-多协议接入 2.创建基于HTTP协议的产品 添加产品属性 创建产品成功后,可以开始添加具体的设备了。