Java数组越界与If条件未触发问题排查(双表数据处理场景)
Java数据库查询逻辑代码问题排查与修复
问题背景
现有两张数据库表:
fff表:包含start_date、holdings、end_date字段holdings表:包含start_date、holder_name字段
需求为编写Java代码实现:根据holdings表中连续记录的holder_name是否相同,执行不同参数的数据库查询,但当前代码存在两个问题:
- 无法进入
if (filteredStartDate.get(i).equals(listOfNonConsolidatedHoldings.get(j).getId().getStartDate()))条件判断 - 若进入该条件,会在
if (i > 0 && listOfNonConsolidatedHoldings.get(j - 1).getHolderName().equals(listOfNonConsolidatedHoldings.get(j).getHolderName()))行触发数组下标越界异常
注:listOfNonConsolidatedHoldings对应holdings表数据,filteredStartDate、filteredEndDate对应fff表的日期数据
问题1:日期相等判断条件无法进入的修复
原因分析
核心问题是日期对象的类型不匹配或时间精度不一致:
- 比如
filteredStartDate存储的是java.util.Date,而holdings表返回的是java.sql.Date,两者的equals方法会因类型不同返回false - 数据库存储日期时仅保留年月日,但内存中的日期对象包含时分秒,导致时间戳不一致,
equals判断不成立
修复方案
方案1:统一为LocalDate类型(Java 8+推荐)
将两边日期转换为仅保留年月日的LocalDate类型后再比较:
// 假设filteredStartDate.get(i)是Date类型,转换为LocalDate LocalDate filterDate = ((java.sql.Date) filteredStartDate.get(i)).toLocalDate(); LocalDate holdingDate = listOfNonConsolidatedHoldings.get(j).getId().getStartDate().toLocalDate(); if (filterDate.equals(holdingDate)) { // 执行后续逻辑 }
方案2:通过时间戳比较
直接获取日期对象的毫秒时间戳进行数值比较,规避类型差异:
if (filteredStartDate.get(i).getTime() == listOfNonConsolidatedHoldings.get(j).getId().getStartDate().getTime()) { // 执行后续逻辑 }
问题2:下标越界异常的修复
原因分析
判断条件错误:代码中用i > 0做边界检查,但实际访问的是listOfNonConsolidatedHoldings的j-1下标。当j=0时,j-1=-1,超出集合下标范围,触发异常。
修复方案
将条件中的i > 0改为j > 0,确保j-1是合法的非负下标:
if (j > 0 && listOfNonConsolidatedHoldings.get(j - 1).getHolderName().equals(listOfNonConsolidatedHoldings.get(j).getHolderName())) { // 连续记录holder_name相同的处理逻辑 }
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

