[英]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.