You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java数组越界与If条件未触发问题排查(双表数据处理场景)

Java数据库查询逻辑代码问题排查与修复

问题背景

现有两张数据库表:

  • fff表:包含start_date、holdings、end_date字段
  • holdings表:包含start_date、holder_name字段

需求为编写Java代码实现:根据holdings表中连续记录的holder_name是否相同,执行不同参数的数据库查询,但当前代码存在两个问题:

  1. 无法进入if (filteredStartDate.get(i).equals(listOfNonConsolidatedHoldings.get(j).getId().getStartDate()))条件判断
  2. 若进入该条件,会在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:28