gpt4 book ai didi

java - ArrayIndexOutOfBoundException 与 IndexOutOfBoundException

转载 作者:行者123 更新时间:2023-12-03 01:30:04 26 4
gpt4 key购买 nike

如果我们创建一个如下所示的虚拟 ArrayList 并使用 -11 作为参数调用 get 方法。然后我们得到以下输出:

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

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

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

请解释一下为什么两者之间存在差异?

最佳答案

这是 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 是正确的的get方法抛出 IndexOutOfBoundsException对于负索引和索引 >= 列表的大小。

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

private void checkElementIndex(int index) {
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

/**
* Tells if the argument is the index of an existing element.
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}

关于java - ArrayIndexOutOfBoundException 与 IndexOutOfBoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44679014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com