如果我们在下面创建一个虚拟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
请解释为什么这两者有区别?
答案 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
的大小不一定会引发异常。
ArrayIndexOutOfBoundsException
是IndexOutOfBoundsException
的子类,这意味着说ArrayList
的{{1}}方法对两个负指数都抛出get
是正确的和索引> =列表的大小。
请注意,与IndexOutOfBoundsException
不同,ArrayList
会为负和非负索引抛出LinkedList
,因为它没有数组支持,所以它不能依赖于数组来抛出负指数的例外:
IndexOutOfBoundsException