2013-06-29 48 views
1

今天我遇到了一個奇怪的錯誤。這花了我很多時間。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.

謝謝!

+0

你嘗試'的for(int i = 0,1 = newList.size(); I < l; i ++)'? 你也可以使用'listPeople.addAll(newList)'將一個數組的所有元素複製到另一個' – TulaGingerbread

回答

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

你確定嗎? newList.size()... listPeople.add – Paolof76

+0

「newList = smsUtils.getPeopleList();」 「getPeopleList()」方法必須返回listPeople。 –

+0

是的,這是一種可能性:他正在引用參考文獻... – Paolof76

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)