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

SpringBoot中使用Pageable接口出现IndexOutOfBoundsException如何处理?

问题根因

异常触发的核心原因是当查询条件没有匹配到任何数据时,Page.getContent()会返回空的List,此时调用List.get(0)会直接抛出索引越界异常。你当前的写法是用捕获全局Exception的方式兜底,属于用异常处理正常业务分支(无匹配数据本身是合理的业务场景),性能和代码可读性都不好。

最优处理方案
  • 方案1:先判断内容是否存在再取值(推荐)

直接在获取元素前先判断Page是否有内容,从源头避免异常触发,修改后的业务代码如下:

try {
    Page<Repo> resultPage = repo.findByIdDateAndValueExists(data.getId(), data.getDate(), request);
    Repo product = null;
    if (resultPage.hasContent()) {
        product = resultPage.getContent().get(0);
        // 后续product的业务处理逻辑
    } else {
        // 无匹配数据时的自定义业务逻辑,比如打日志、返回默认值、抛出业务异常等
        LOGGER.info("No matched product found for ID: {}, Date: {}", data.getId(), data.getDate());
    }
} catch (Exception e) {
    // 这里仅处理真正的异常场景,比如数据库连接失败、查询语法错误等
    LOGGER.error("Failed to query product: {}", e.getMessage(), e);
}
  • 方案2:优化Repository层定义,直接返回单条结果(更适配取最新一条的需求)

如果你不需要分页信息,只需要取符合条件的最新一条数据,可以直接把Repository方法定义为返回Optional,避免分页相关的冗余操作:

@Query(value = "{'ID': ?0, 'Date' : ?1 ,'value':{'$exists': true}}")
Optional<Repo> findFirstByIdAndDateAndValueExists(String Id, String Date, Sort sort);

调用时直接判断Optional是否为空即可,代码更简洁:

try {
    // Sort参数按你的排序规则传入,比如按更新时间倒序取最新的
    Optional<Repo> productOpt = repo.findFirstByIdAndDateAndValueExists(data.getId(), data.getDate(), Sort.by(Sort.Direction.DESC, "updateTime"));
    if (productOpt.isPresent()) {
        Repo product = productOpt.get();
        // 业务处理逻辑
    } else {
        // 无数据的处理逻辑
    }
} catch (Exception e) {
    LOGGER.error("Failed to query product: {}", e.getMessage(), e);
}
异常捕获优化建议

如果确实需要保留捕获逻辑,不要捕获泛化的Exception,可以只捕获明确的非预期异常,比如DataAccessException等数据库操作相关异常,避免把参数校验错误这类业务异常也一并吞掉,方便后续排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:45:03