2015-12-15 5 views
3

Так я создаю Android приложение и этот код, что бросает «Вызванный: java.lang.OutOfMemoryError: OutOfMemoryError выброшен при попытке бросить OutOfMemoryError, нет трассировки стека доступны " ошибка:(Android) OutOfMemoryError выброшен при попытке бросить OutOfMemoryError

public ArrayList<Double> statModa(ArrayList<Double> statRed, ArrayList<Double> uniqueRed) { 
    ArrayList<Double> result = new ArrayList<>(); 
    int maxFreqIndex = 0; 
    int maxFreq = Collections.frequency(statRed, uniqueRed.get(0)); 
    for (int i=1; i < statRed.size(); i++){ 
     int currentFreq = Collections.frequency(statRed, statRed.get(i)); 
     if ((currentFreq > maxFreq) || (currentFreq == maxFreq && statRed.get(i) == statRed.get(maxFreqIndex))) { 
      maxFreqIndex = i; 
      maxFreq = currentFreq; 
     } 
    } 

    if (maxFreq == statRed.size()/uniqueRed.size()) 
     return result; 

    if (maxFreqIndex == statRed.size()-1){ 
     result.add(statRed.get(maxFreqIndex)); 
     return result; 
    } 

    for (int i=maxFreqIndex+1; i < statRed.size(); i++){ 
     int currentFreq = Collections.frequency(statRed, statRed.get(i)); 
     if (currentFreq != maxFreq) { 
      result.add(statRed.get(maxFreqIndex)); 
      int tempIndex = maxFreqIndexFinder(statRed, i, maxFreq); 
      if (tempIndex == maxFreqIndex) { 
       break; 
      } else { 
       i = tempIndex; 
       maxFreqIndex = tempIndex; 
      } 
     } else { 
      double temp = statRed.get(maxFreqIndex); 
      int tempTimes = 1; 
      for (int j=1; i + currentFreq*j - 1 < statRed.size(); j++){ 
       if (currentFreq == Collections.frequency(statRed, statRed.get(i + currentFreq*j - 1))) { 
        temp += statRed.get(i + currentFreq * j - 1); 
        tempTimes++; 
        maxFreqIndex = i + currentFreq * j - 1; 
       } else { 
        break; 
       } 
      } 
      result.add(temp/(double)tempTimes); 
      i = maxFreqIndex; 
     } 
    } 

    return result; 
} 

public int maxFreqIndexFinder(ArrayList<Double> statRed, int startingIndex, int maxFreq){ 
    int resultIndex = startingIndex - 1; 
    int count = 0; 
    double lastFreqValue = 0; 
    for (int i = startingIndex; i < statRed.size(); i++){ 
     int currentFreq = Collections.frequency(statRed, statRed.get(i)); 
     if (currentFreq == maxFreq) { 
      count++; 
      if (count == 1) { 
       resultIndex = i; 
       lastFreqValue = statRed.get(i); 
      } else { 
       if (lastFreqValue == statRed.get(i)) { 
        resultIndex = i; 
        lastFreqValue = statRed.get(i); 
       } else { 
        break; 
       } 
      } 
     } 
    } 
    return resultIndex; 
} 

Я не совсем уверен, что именно вызывает ошибку. Я подозреваю бесконечный цикл, но я не мог его найти, поэтому я спрашиваю здесь. Кроме того, перед выбросом ошибки он постоянно выделяет память.

Вот лог консоли (если необходимо): PasteBin

Дополнительная информация:

Функция statModa побежал, когда кнопка нажата.

Красный означает линию.

Значения я запустил приложение с и получил сообщение об ошибке в следующем:

ArrayListstatRed имеет значения {0,1, 1, 1, 2, 2, 3, 3, 4, 5 5 5} и

ArrayListuniqueRed имеет значения {0,1, 1, 2, 3, 4, 5}.

Также это не - только значения, которые дают мне эту ошибку. Если это (maxFreq == statRed.size()/uniqueRed.size()) истинно, тогда нет ошибки, если нет, то я получаю ошибку.

P.S. Я видел еще один вопрос с той же ошибкой, был только один Ответ, который должен был включить largeHeap, но это не сработало для меня.

+0

'statRed имеет значение {0,1, 1, 1, 2 , 2, 3, 3, 4, 5 5 5} ': должны ли у 5 5 5 запятые между ними? –

+0

Пожалуйста, используйте отладчик, чтобы сузить проблему. –

+1

ваш код выглядит довольно уродливым и чрезмерно сложным, но я бы предложил попытаться удалить его части, выглядит как бесконечный цикл или что-то подобное ... –

ответ

4

ОЫЙ из-за линией i = maxFreqIndex;, как и для данного входа maxFreqIndex 8 и не изменяется, так что вы получите бесконечный цикл в for (int i=maxFreqIndex+1; i < statRed.size(); i++)

Смежные вопросы