ArrayIndexOutOfBoundException与IndexOutOfBoundException

时间:2017-06-21 14:31:33

标签: java

如果我们在下面创建一个虚拟ArrayList并使用get-1作为参数调用1方法。然后我们得到以下output

  • 对于测试用例1:它抛出ArrayIndexOutOfBoundException

  • 对于测试用例2:它抛出IndexOutOfBoundException

    List list = new ArrayList();
    list.get(-1); //Test Case 1
    list.get(1); // Test Case 2
    

请解释为什么这两者有区别?

1 个答案:

答案 0 :(得分:6)

这是ArrayList

的实施细节

ArrayList由数组支持。对具有负索引的数组的访问会引发ArrayIndexOutOfBoundsException,因此不必由ArrayList类的代码显式测试。

另一方面,如果您访问的ArrayList非负索引超出ArrayList的范围(即> = ArrayList的大小) ,使用以下方法执行特定检查,该方法抛出IndexOutOfBoundsException

/**
 * Checks if the given index is in range.  If not, throws an appropriate
 * runtime exception.  This method does *not* check if the index is
 * negative: It is always used immediately prior to an array access,
 * which throws an ArrayIndexOutOfBoundsException if index is negative.
 */
private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

此检查是必要的,因为提供的索引可能是后备阵列的有效索引(如果它小于ArrayList的当前容量),因此使用索引> =访问后备阵列ArrayList的大小不一定会引发异常。

ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsException的子类,这意味着说ArrayList的{​​{1}}方法对两个负指数都抛出get是正确的和索引> =列表的大小。

请注意,与IndexOutOfBoundsException不同,ArrayList会为负和非负索引抛出LinkedList,因为它没有数组支持,所以它不能依赖于数组来抛出负指数的例外:

IndexOutOfBoundsException