添加到ArrayList时的IndexOutOfBoundsException

时间:2016-03-21 17:03:52

标签: java android arraylist indexoutofboundsexception

调用java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3时,我的gettgin list.add(location, item);异常为add方法调用了JavaDoc:

  

如果位置等于此List的大小,则添加该对象   最后。

我完全感到困惑,因为它还说IndexOutOfBoundsException时应该抛出location < 0 || location > size(),但即使在异常位置和大小相同的情况下也是如此。

编辑:我在这里复制粘贴完整的javadoc,看看是什么让我感到不舒服。

public abstract void add (int location, E object)

在API级别1中添加

将指定对象插入指定位置的此List中。该对象在指定位置的当前元素之前插入。如果位置等于此List的大小,则在末尾添加对象。如果该位置小于此List的大小,则超出指定位置的所有元素将向列表的末尾移动一个位置。

参数

  • location - 要插入的索引。
  • object - 要添加的对象。

抛出

  • UnsupportedOperationException - 如果不支持添加到此列表。
  • ClassCastException - 如果对象的类不适合此List。
  • IllegalArgumentException - 如果无法将对象添加到此列表中。
  • IndexOutOfBoundsException - 如果location&lt; 0 ||位置&gt;尺寸()

编辑#2 :请求的实际代码:

Date newDate = sourceDateFormatter.parse(newTime.getDate());
Date date;
int insert = -1;
do {
    insert++;
    date = sourceDateFormatter.parse(list.get(insert).getDate());
} while(date.compareTo(newDate) < 0);

list.add(insert, newTime);

4 个答案:

答案 0 :(得分:0)

Java中的数组和列表是0索引的。因此,如果您的尺寸为3,则您在0,1和2位置有物品。您的if条件应为

location < 0 || location >= size()

答案 1 :(得分:0)

你实际上是或者给出了一个错误的位置,基于非零或者可能只是错过了使用indext,请参阅java列表是基于0的所以如果大小为3则最后一个索引应该是2(0,1 ,2),只做其中一个:

list.add(location-1, item);

list.add(item);

你应该做得很好

答案 2 :(得分:0)

如果要将新对象放在第一个项目之前,则为:

list.add(0, item);

如果您希望新对象在第n个项目之前,那么它将是

list.add(n-1, item);

如果要插入最后一项,

list.add(item);

答案 3 :(得分:0)

当我发布我的方法时,我已经注意到了这个问题。无论出于何种原因,当我点击链接时,我的logcat指向.add(index, object);方法,但实际上是.get(index);抛出异常,这完全有道理。

做了一些调整,现在这段代码按预期工作:

Date newDate = sourceDateFormatter.parse(newTime.getDate());
Date date;
int insert = 0;
do {
    date = sourceDateFormatter.parse(list.get(insert).getDate());
} while(date.compareTo(newDate) < 0 && ++insert < list.size());

list.add(insert, newTime);