Arraylist发生了一个奇怪的错误

时间:2013-06-29 03:37:51

标签: java android arraylist

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

@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个。

谢谢!

2 个答案:

答案 0 :(得分: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的大小增长到无穷大,循环永远不会停止。

答案 1 :(得分:1)

这是使用java foreach的一个很好的理由。您可以使用foreach语句而不是for(int i = 0; i&lt; 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)