ArrayList的add(index,object)方法抛出OutOfMemoryError

时间:2015-07-18 22:03:57

标签: java arraylist out-of-memory

错误:

java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source) ~[?:1.8.0_31]
    at java.util.Arrays.copyOf(Unknown Source) ~[?:1.8.0_31]
    at java.util.ArrayList.grow(Unknown Source) ~[?:1.8.0_31]
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) ~[?:1.8.0_31]
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source) ~[?:1.8.0_31]
    at java.util.ArrayList.add(Unknown Source) ~[?:1.8.0_31]
    at mcs.controllers.StatsController$PatenteController.loadPatentes(StatsController.java:116) ~[?:?]

我的代码:

private List<Patente> patentes = new ArrayList<>();

int exp = 301; 
for(int i=0; i<patentes.size(); i++) {
 if(exp<patentes.get(i).getRequiredEXP()) {
    patentes.add(i, pat); //Line 116 (where the error occurs)
  } else {
    x=i+1;
 }
}

服务器保持静止一段时间,此错误发生后不久。

1 个答案:

答案 0 :(得分:1)

只要满足条件exp<patentes.get(i).getRequiredEXP(),此代码就会创建一个无限大的列表,因为patentes.add(i , pat)会将先前位于i的元素推送到位置i + 1,因此条件将再次在循环的下一步中完成。循环运行直到i到达patentes.size(),每次添加新元素时,该循环将增加1。因此,您创建了一个向列表添加元素的无限循环。由于java只有有限的内存,因此抛出OutOfMemoryException