Java for循环永远不会终止

3

我正在尝试创建一个基本的for循环,将临时列表的元素添加到主ArrayList中。这导致我的Android应用程序反复崩溃。

    for (int i = 0; i<tempFavList.size();i++){
        Log.v("MyApp",Integer.toString(tempFavList.size()));
        favourites.add(tempFavList.get(i).toString());
    }

一些调试显示,在 for 循环被调用之前,tempFavList.size() 等于 2,但是在 for 循环被调用时它变成了无限大(至少增加到 +500,000,然后应用程序崩溃)。列表 tempFavList 是使用代码 tempFavList = currentUser.getList("favourites"); 从 Parse 数据库中提取的一个 List。
我很困惑为什么临时列表的大小一旦调用 for 循环就会增加,因为我没有在 for 循环中添加任何项。任何帮助将不胜感激。

27
“favourites”和“tempFavList”可能指向同一对象吗? - Dawood ibn Kareem
1
尝试在循环内打印 tempFavList.size()favourites.size(),看看会得到什么。 - Baby
2
调试提示 - 尝试在不更改“那个”数组的情况下运行此循环。看看它是否有效。然后尝试弄清楚为什么“那个”数组会发生变化。 - Richard Le Mesurier
我的猜测是你将tempFavList声明为tempFavList = favourites。请注意,这个语句不会复制你的列表:这两个对象指向同一个引用,所以你添加到tempFavList的所有内容也会被添加到favourites中。 - BackSlash
@ImmerAllein:我尝试了这个,两个大小以相似的速度增长(虽然它们不同,在for循环之前favourites.size()等于0,tempFavList.size()等于2。@RichardLeMesurier:感谢您的提示。我尝试了这个,问题没有出现。这会让我认为这行是问题所在,但我仍然不清楚它的原因。 - moneymango
显示剩余3条评论
4个回答

3
您可以尝试以下方法:
final int tempSize = tempFavList.size();

for (int i = 0; i < tempSize; i++){
    ....
}    

谢谢!这似乎解决了问题。我仍然不确定列表是如何或在哪里引用相同的对象,但现在这样做就可以了。 - moneymango
如果你执行 System.out.println(favourites),列表中有什么?2个元素还是4个? - zpontikas

1

好的,我认为你正在做的事情是在这里发布的代码中有95%是你自己写的。

import java.util.ArrayList;
import java.util.List;
public class Temp {
    static ArrayList<String> favourites = new ArrayList<String>();
    public static void main(String[] args) {
        List<String> myGuiltyList= CurrentUser.getList("favourites");
        for (int i = 0; i < myGuiltyList.size(); i++) {
            System.out.println("myInnocentList size = " + favourites.size());
            favourites.add(myGuiltyList.get(i));
            if (myGuiltyList.size() == 1000) {
                break;
            }
        }
    }
    private static class CurrentUser {
        public static List<String> getList(String listName) {
            favourites.add("1");
            favourites.add("2");
            favourites.add("3");
            if (listName.equals("favourites")) {
                return favourites;
            }
            else return null;
        }
    }
}

问题在于,您所命名的静态列表“favourites”实际上是当您调用CurrentUser.getList("favourites");时获取的同一列表。

因此,它们实际上是相同的列表,您向同一列表添加元素,并且每次循环列表的大小都会增加,而循环永远不会停止,因为列表的大小永远不会小于i,因为它们以相同的比率增加:D

currentUser 实际上是一个 ParseUser 对象,它是使用代码 ParseUser currentUser = ParseUser.getCurrentUser(); 创建的。行 tempFavList = currentUser.getList("favourites"); 从 ParseUser currentUser 返回具有键“favourites”的列。这个“favourites”只是一个字符串键,并不是收藏夹列表。 - moneymango
你的错误完全是两个列表引用了同一个对象。 - zpontikas

0

使用迭代器进行迭代:

for (Object o : tempFavList){
    Log.v("MyApp",Integer.toString(tempFavList.size()));
    favourites.add(o.toString());
}  

如果在迭代过程中修改了集合,它很可能会抛出异常。


0
for (Iterator iterator = tempFavList.iterator(); iterator.hasNext();)
{ favourites.add(iterator.next());}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接