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

从Java8迁移至Java11出现IndexOutOfBoundsException问题求助

JDK8升级JDK11后索引越界异常类型变化问题原因分析
  • 核心原因是JDK9及以上版本对集合类的边界检查逻辑做了内部重构:JDK8中ArrayList等集合类的边界校验逻辑为各自独立实现,遇到索引越界时会直接抛出ArrayIndexOutOfBoundsException子类;JDK9之后官方将通用边界校验逻辑抽离到jdk.internal.util.Preconditions公共工具类中统一实现,该工具类默认抛出的是父类IndexOutOfBoundsException,你提供的报错堆栈中的Preconditions.outOfBounds调用记录也正好印证了这一点。
  • 该实现完全符合Java官方规范:你查阅的文档中提到的「负索引抛出ArrayIndexOutOfBoundsException」仅适用于原生数组的操作场景,集合类的官方规范仅要求索引越界时抛出IndexOutOfBoundsException或其子类即可,并没有强制要求必须抛出ArrayIndexOutOfBoundsException子类,JDK11的实现不属于缺陷。
  • 测试失败是因为测试逻辑耦合了JDK非公开的实现细节:你的测试用例应该是写死了精确匹配ArrayIndexOutOfBoundsException类型,属于不合理的断言逻辑。修复方案非常简单,只需要将测试中的异常类型校验改为匹配父类IndexOutOfBoundsException,即可同时兼容JDK8和JDK11+的运行环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:30:03