簡體   English   中英

Arraylist發生了一個奇怪的錯誤

[英]An strange error happened with 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個元素。

謝謝!

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的大小增長到無窮大,循環永遠不會停止。

這是使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM