求助排查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
相关产品推荐
相关产品推荐

