关于 ArrayList get(0) 的异常 JDK 源码跟进

 


 

1 )下面是模拟代码


关于 ArrayList get(0)的异常JDK源码跟进

 

2 debug 过来后看到 ArrayList 内部是用 Object 数组来初始化。


关于 ArrayList get(0)的异常JDK源码跟进
 

直接运行完毕会报出如下错误。


关于 ArrayList get(0)的异常JDK源码跟进

 

3 )然后我们来看看源码,也发现确实使用名为 elementData 的数组来做 ArrayList 的相关操作。


关于 ArrayList get(0)的异常JDK源码跟进

 

 

3 个构造方法。


关于 ArrayList get(0)的异常JDK源码跟进

 

3 个构造方法全部都是初始化这个 elementData 数组。


关于 ArrayList get(0)的异常JDK源码跟进

 


关于 ArrayList get(0)的异常JDK源码跟进

 


关于 ArrayList get(0)的异常JDK源码跟进

 

 

 

 

4 )我们的 get(int index) 方法 ArrayList 实现的 List get 方法。里面有个很关键的地方,就是在返回这个泛型 Object 的时候,经过了 RangeCheck(index) 检查。


关于 ArrayList get(0)的异常JDK源码跟进

 

我们进到这个方法就明白肯定是进入这个 if 了。


关于 ArrayList get(0)的异常JDK源码跟进

 

 

 

 

再来看看我们天天使用的 isEmepty() size() 的含义。


关于 ArrayList get(0)的异常JDK源码跟进

 


关于 ArrayList get(0)的异常JDK源码跟进

 


关于 ArrayList get(0)的异常JDK源码跟进

 

并且在进行 add 方法后是这样处理的。


关于 ArrayList get(0)的异常JDK源码跟进

 

 

 

 

 

 

 

 

总结:

这下我们就明白 RangeCheck(index) 的用意了,是 jdk 内部做了一定的异常处理,在我们要使用之前就先报了 IndexOutOfBoundsException 异常,并且 List 底层是由数组实现,其实也不会报 NullPointerException 的异常,因为它已经知道,我们在并没有初始化 elementData 数组内容之前就开始调用内部数组的值,希望大家能通过此文更加了解 ArrayList ,如果我说的有错,请知会我,大家共同进步。

                 

                                                  田军 tKF25401

                                                 2010-04-27

 

 

相关文章: