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

求助排查java.lang.IndexOutOfBoundsException异常:数组非空仍报错

问题:调用MetamodelFieldService.remove时触发IndexOutOfBoundsException

调用MetamodelFieldService的remove方法时,抛出java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0异常。已通过日志确认传入的oldMetaFieldId=1007、metamodelId=215,且传入的数组不为空,但无法定位报错原因。

相关代码与日志

调用前的日志打印代码

REPORT.info("Removing meta_field id {} from metamodel id {}", Integer[]{oldMetaFieldId, metamodelId});

remove方法调用代码

App.get(MetamodelFieldService.class).remove(metamodelId, new Integer[]{oldMetaFieldId});

remove方法实现代码

public void remove(Integer metamodelId, Integer[] metaFieldIdList) {
    for (Integer metaFieldId : metaFieldIdList) {
      MetamodelField ex = new MetamodelField();
      ex.setMetamodelId(metamodelId);
      ex.setMetaFieldId(metaFieldId);
      List<MetamodelField> entityList = getDao().findByExample(ex);

      entityList.get(0);
      remove(entityList.get(0));
    }
    MetaModelCache.getCache().clear(getApplicationSession());
}

日志信息

2023-06-20 15:12:21,776  INFO [main] FusionChampsFiches - Removing meta_field id [1007] from metamodel id 215

问题原因与解决办法

原因

报错直接触发在entityList.get(0)行,说明getDao().findByExample(ex)查询返回的entityList是空集合。也就是说,数据库中不存在同时满足metamodelId=215且metaFieldId=1007的MetamodelField记录。

虽然传入的参数值正确,但数据库里可能没有对应数据,或者findByExample的查询逻辑和预期不符(比如实体类字段映射错误、查询时遗漏了必要条件等)。

解决办法

  • 直接检查数据库:执行SQL查询,确认是否存在metamodel_id=215且meta_field_id=1007的记录。
  • 添加空集合校验:在调用entityList.get(0)前先判断集合是否为空,避免索引越界:
    if (!entityList.isEmpty()) {
        remove(entityList.get(0));
    } else {
        REPORT.warn("未找到metamodelId={}且metaFieldId={}的MetamodelField记录", metamodelId, metaFieldId);
    }
    
  • 排查findByExample逻辑:确认DAO层的findByExample实现是否正确,比如是否严格按照实体类非空字段构建查询条件,有没有字段映射错误的情况。

内容的提问来源于stack exchange,提问作者JhinKazama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:13:16