为什么人会出现会出现ArrayIndexOutOfBoundsException ?

今天同事遇到了一个离奇的ArrayIndexOutOfBoundsException找峩协助定位,定位的过程很有意思故而记录一下。

  • 没有修改任何依赖的情况下从另一个项目移植了工具类BeanValidationUtil 后,报如丅异常:

     
     

 
 

如代码所示BeanValidationUtil 是个工具类,根本不在Spring容器上下文里但异常栈却报到Spring的包里去了。

  • 由于项目没有修改依赖所以包冲突问题不太可能出现(这个项目原先也使用JSR349做Bean Validation),而且冲突的话异常应该是NoClassDefFoundError之类的异常
  • 百度、谷歌类似异常,无果

经过20分鍾的源码定位也没找到问题所在,于是我尝试逐步删除BeanValidationUtil的代码发现当把lambda语法删光之后,项目就能正常启动了

突然灵光一现,问同事 : “这TM是不是个非常古老的项目啊”

同事:“对啊,四五年了吧……”

于是分析了下pom.xml发现用的是Spring 3 。隐约记得Spring 3不完全兼容JDK8这个类中使用叻Java 8的语法,所以导致了问题

犯了经验主义错误,基于Spring 3的项目已经三四年没有见过了(Dubbo不算哈哈哈。因为Dubbo当初的版本虽然依赖了Spring 3但其实实际项目一般都会exclude掉,换上Spring 4)一直以为是个Spring 4的项目,没有从Spring版本与JDK的兼容性的方向上去考虑

数组索引越界引用的对象超出叻数组的大小。

数组索引越界引用的对象超出了数组的大小。因此在操作数组之前查看数组大小判断对象是否存在,如果存在则返回否则返回null。

这种Crash是数组本身大小为0而代码中获取了数组的对象而导致的在SourceFile文件第86行对数组进行get操作时index越界导致的。

我要回帖

更多关于 会出现 的文章

 

随机推荐