ArrayIndexOutOfBoundException和IndexOutOfBoundsException

时间:2018-04-09 17:10:44

标签: java exception

这里的异常是IndexOutOfBoundsException:

public static void main(String[] args) {
    List<Integer> elements = new ArrayList<>();
     elements.add(10);
     int firstElmnt = elements.get(1);
     System.out.println(firstElmnt);
}

但是Exception是ArrayIndexOutOfBoundsException:

public static void main(String[] args) {
    List<Integer> elements = new ArrayList<>();
     elements.add(10);
     int firstElmnt = elements.get(-1);
     System.out.println(firstElmnt);
}

对于负数,这是否意味着我们得到IndexOutOfBoundException?

2 个答案:

答案 0 :(得分:4)

List的Javadoc指定抛出IndexOutOfBoundsException

  

如果索引超出范围(索引&lt; 0 || index&gt; = size())

由于ArrayIndexOutOfBoundsExceptionIndexOutOfBoundsException的子类,List接口的实现可以选择抛出该异常而不是基类IndexOutOfBoundsException类。

对于超出范围的正索引,此代码抛出异常:

private void rangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

另一方面,对于负索引,通过使用负索引访问支持数组会抛出异常:

E elementData(int index) {
    return (E) elementData[index];
}

这为ArrayList实现保存了明确检查索引是否为负的需要。

答案 1 :(得分:-7)

你在第一个代码中得到IndexOutOfBoundsException,因为在ArrayList的实现中你有一个大小为10的数组,而你正试图得到该数组的第二个索引,这个index在数组中,但你不在其上添加任何元素。

第二个是ArrayIndexOutOfBoundsException,因为你试图获得超出数组范围的索引。