从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
相关产品推荐
相关产品推荐

