【问题标题】:IndexOutOfBoundsException when adding to ArrayList添加到 ArrayList 时出现 IndexOutOfBoundsException
【发布时间】:2016-03-21 17:03:52
【问题描述】:

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

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

我完全糊涂了,因为它还说当location < 0 || location > size() 时应该抛出IndexOutOfBoundsException,但即使在异常位置和大小相等时也是如此。

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

public abstract void add (int location, E object)

在 API 级别 1 中添加

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

参数

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

投掷

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

编辑#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);

【问题讨论】:

  • 如果大小为 3,则最大元素位于 pos 2
  • 如果要附加List,则无需指定index,只需调用list.add(item);
  • @Xoce웃Пepeúpa 如果我将它添加到 pos2,则 pos2 处的元素将被推送到 pos3,这不是我想要的。我想将它添加为最后一个元素。
  • @ElliottFrisch 此添加位于一个循环内,该循环确定新项目应在列表中的哪个位置,这就是我想要它的原因。唯一的问题是,当我想将它添加到列表的末尾时,它会抛出这个异常,正如 javadoc 所说的那样。
  • 向我们展示您正在使用的实际代码。当我调用 list.add( list.size(), newitem ) 时我没有问题,其中 list 是一个 ArrayList 实例。

标签: java android arraylist indexoutofboundsexception


【解决方案1】:

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

location < 0 || location >= size()

【讨论】:

  • 这不是我的 if 条件,我从 .add 方法的 javadoc 中复制粘贴了它。如果我将其添加到位置 2,则位于 pos2 中的对象将被推送到 pos3。
【解决方案2】:

嗯,你实际上是或者给出了一个错误的位置,基于非零或者可能只是错过了使用 indext,请参阅 java Lists are 0 based so if the size is 3 the last index should be 2 (0,1 ,2),只需执行以下操作之一:

list.add(location-1, item);

list.add(item);

你应该做得很好

【讨论】:

    【解决方案3】:

    如果你想把新对象放在第一项之前,那就是:

    list.add(0, item);
    

    如果你想让新对象在第 n 项之前,那就是

    list.add(n-1, item);
    

    如果要作为最后一项插入,

    list.add(item);
    

    【讨论】:

    • 当我阅读该方法的 javadoc 时,list.add(n, item); 应该最后添加项目。检查我对问题的编辑。
    • 什么是“列表”类?
    • List list = new ArrayList();
    • List list = new ArrayList(); list.add("AAA");list.add(1, "BBB");它有效,因为我使用了 java.util.ArrayList 和 java.util.List
    【解决方案4】:

    当我发布我的方法时,我注意到了这个问题。无论出于何种原因,当我单击链接时,我的 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);
    

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      相关资源
      最近更新 更多