1

今天我遇到了一个奇怪的错误。我花了很多时间。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    MainActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("list people size:");
            System.out.println(listPeople.size());


            listPeople.clear();
            ArrayList<PeopleModel> newList = new ArrayList<PeopleModel>();
            newList = smsUtils.getPeopleList();
            // newList.size() = 42.
            for(int i=0;i<newList.size();i++){ 
                System.out.println(i);
                listPeople.add(newList.get(i));
            }
            //**strange error happened in loop above. I don't know why**
            // **it loops to infinity and causes outofmemory.**
            System.out.println("list new people size:");
            System.out.println(newList.size());

            if(adapter!=null){

                adapter.notifyDataSetChanged();
            }
        }
    });
}

以前,我用过:

listPeople = smsUtils.getPeopleList();

但是发生了另一个奇怪的错误。listPeople现在有 84 个元素而不是 42 个。

谢谢!

4

2 回答 2

3
ArrayList<PeopleModel> newList = new ArrayList<PeopleModel>();
newList = smsUtils.getPeopleList();
for(int i=0;i<newList.size();i++){ 
    System.out.println(i);
    listPeople.add(newList.get(i)); // Here's the infinity problem.
}

您正在从零迭代到 newList 的 SIZE。问题是,在每个循环中,您都在添加到 newList。所以...... newList 的大小会增长到无穷大,并且循环永远不会停止。

于 2013-06-29T03:41:53.607 回答
1

这是使用 java foreach 的一个很好的理由。您可以使用 foreach 语句而不是 for(int i=0;i<newList.size();i++) 发现问题(即您对 newList 和 listPeople 使用相同的数组引用)。

尝试这个:

public class Train {
    public void doit() {
        List<Integer> newList = new ArrayList<Integer>();
        newList.add(1);
        newList.add(2);
        newList.add(3);
        newList.add(4);
        newList.add(5);

        for(Integer elem: newList){
            System.out.println(newList.size());
            newList.add(6);
        }
        //instead of:
        /*for(int i=0;i<newList.size();i++){
            System.out.println(i);
            newList.add(6);
        }*/
    }

}

你会在编译时得到:

java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at my.webapp.utils.Train.doit(Train.java:26)
    at RunTrain.runDoit(RunTrain.java:9)
于 2013-06-29T12:29:20.913 回答