0

我遇到了一个非常烦人的问题,一些代码抛出了 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()" 

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

4

3 回答 3

2

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

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

所以这:

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任何地方使用,请稍微清洁一点。

于 2012-04-21T19:44:05.190 回答
1
i<sortedFridayTimes.size()+1

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

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

所以应该是:

for(int i=0; i<sortedFridayTimes.size(); i++) {
于 2012-04-21T19:35:32.013 回答
1

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

sortedFridayTimes.get(sortedFridayTimes.size())

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

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

于 2012-04-21T19:36:21.033 回答