【问题标题】:IndexOutOfBoundsException with Android ArrayList [duplicate]带有 Android ArrayList 的 IndexOutOfBoundsException
【发布时间】:2012-05-02 23:39:40
【问题描述】:

我遇到了一个非常烦人的问题,一些代码抛出了 IndexOutOfBoundsException,我真的不明白为什么。 logcat 指向以下代码的“addTimetableItem”,这将进一步解释:

if(sortedFridayTimes.size()>0){
    insertDay("Friday");
    for(int i=1; i<sortedFridayTimes.size()+1;i++){
        addTimetableItem(sortedFridayTimes.get(i));
    }
}

"sortedFridayTimes" 是一个 ArrayList,其中包含我自己的“时间表条目”对象,我已经按顺序对其进行了排序。首先检查大小以查看是否有任何对象,然后如果有“insertDay”运行,它会为标题创建一个新的文本视图并将其添加到布局中(这工作正常..)。 在 for 循环中,想法是然后将 arraylist 中的所有对象添加到布局中。现在我知道“addTimetableItem”代码就像我已经测试过的那样工作,但我的问题是我似乎无法从数组列表中取出最后一个对象。如果我声明 for 循环只运行

"i<sortedFridayTimes.size()" 

然后程序运行良好,但我没有得到我知道存在的数组列表中的最后一个条目,因为我已经调试并观察了我的变量。在添加如上所示的“+1”时,我现在得到了 IndexOutOfBoundsException,我真的不知道为什么。正如我所说,我已经调试过并且我知道我试图指向的数组列表中存在一个条目,但它只是崩溃了。如果需要,我可以提供更多代码,但有人有什么想法吗?

【问题讨论】:

    标签: java android arraylist indexing indexoutofboundsexception


    【解决方案1】:

    您应该接受@Tim 或@Graham 的回答,这只是一个附录。他们对您的 size()+1 超出数组末尾是正确的。

    如果您无法使用索引正确地从列表中取出所有内容,您也可以尝试使用 for-each 循环(取决于您使用的 Android SDK 版本)。我假设 sortedFridayTimesTimetableItem 类的列表,因为您没有指定。

    所以这个:

    if(sortedFridayTimes.size()>0){
        insertDay("Friday");
        for(int i=1; i<sortedFridayTimes.size()+1;i++){
            addTimetableItem(sortedFridayTimes.get(i));
        }
    }
    

    变成这样:

    if(!sortedFridayTimes.isEmtpy()){
        insertDay("Friday");
        for(TimetimeItem item : sortedFridayTimes){
            addTimetableItem(item);
        }
    }
    

    如果您实际上不需要在任何地方使用i,那就更简洁了。

    【讨论】:

    • Android 最佳实践还建议使用增强的 for 循环以获得更高效的程序。这是一个很好的答案。
    【解决方案2】:
    i<sortedFridayTimes.size()+1
    

    您正在遍历数组中的最后一个元素。为什么是+1

    如果数组中有N 元素,则这些元素是从索引0N-1

    应该是这样的:

    for(int i=0; i<sortedFridayTimes.size(); i++) {
    

    【讨论】:

    • 好吧,我想但是如果说大小是 2,我会从 1 开始并且小于 2,因此代码会执行,但是我会变成 2,它不小于 2 并且因此代码不会运行,我会错过列表中的第二个值..对吗?
    • 为帮助喝彩,现在排序。
    【解决方案3】:

    for 循环中的最后一个循环运行:

    sortedFridayTimes.get(sortedFridayTimes.size())

    这总是超出范围,因为元素是零索引的。

    例如,如果数组大小为“5”,则无法访问索引“5”,因为数组中的 5 个元素为0,1,2,3,4

    【讨论】:

    • 我认为 ArrayList 的索引从 1 开始?
    • 好吧,干杯,真的有点傻,我不知道为什么我认为它是 1,在这里失去了我的头!无论如何,测试和工作,再次感谢。
    • @Josh 如果它解决了您的问题,请确保单击此答案上的accept 复选标记。
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 2016-11-07
    • 2016-03-22
    • 2018-12-03
    • 1970-01-01
    • 2014-01-14
    • 2015-11-07
    相关资源
    最近更新 更多