今天我遇到了一个奇怪的错误。我花了很多时间。
@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 :(得分: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)