У меня есть рекурсивная функция, которая принимает список событий и сортирует их по дате. Он отлично справился, но сегодня я получил сообщение о сбоях в консоли разработчика Google Play. Выбрасывается StackOverflowError.StackOverflowError при сортировке дат рекурсивно
Итак, мой вопрос: кто-то знает, почему это происходит и что делать, чтобы избежать этого?
Моя функция сортировки:
public class SortEventDates {
public List<Event> sortDates(List<Event> eventList) {
int a, b, c, d, e, f, g, h, ix, j;
// Sorting
for (int i = 0; i < eventList.size() - 1; i++) {
a = Integer.valueOf(eventList.get(i).getDate().split("/")[2]); // <--Row 18
b = Integer.valueOf(eventList.get(i+1).getDate().split("/")[2]);
// Sorting years
if (a > b) {
Collections.swap(eventList, i, i+1);
sortDates(eventList);
} else if (a == b) {
c = Integer.valueOf(eventList.get(i).getDate().split("/")[0]);
d = Integer.valueOf(eventList.get(i+1).getDate().split("/")[0]);
// Sorting months
if (c > d) {
Collections.swap(eventList, i, i+1);
sortDates(eventList); // <-- Row 30
} else if (c == d) {
e = Integer.valueOf(eventList.get(i).getDate().split("/")[1]);
f = Integer.valueOf(eventList.get(i+1).getDate().split("/")[1]);
// Sorting days
if (e > f) {
Collections.swap(eventList, i, i+1);
sortDates(eventList); // <-- Row 37
} else if (e == f) {
g = Integer.valueOf(eventList.get(i).getTime().split(":")[0]);
h = Integer.valueOf(eventList.get(i+1).getTime().split(":")[0]);
// Sorting hours
if (g > h) {
Collections.swap(eventList, i, i+1);
sortDates(eventList);
} else if (g == h) {
ix = Integer.valueOf(eventList.get(i).getTime().split(":")[1]);
j = Integer.valueOf(eventList.get(i+1).getTime().split(":")[1]);
// Sorting minutes
if (ix > j) {
Collections.swap(eventList, i, i+1);
sortDates(eventList);
}
}
}
}
}
}
return eventList;
}
}
Стек след:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.StackOverflowError
at java.util.regex.Splitter.fastSplit(Splitter.java:46)
at java.lang.String.split(String.java:1842)
at java.lang.String.split(String.java:1824)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:18)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:37)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:37)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:37)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:30)
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:37)
...
...
at app.android.arret.java.services.SortEventDates.sortDates(SortEventDates.java:30)
at app.android.arret.java.activity.DownloadJSON.doInBackground(DownloadJSON.java:119)
at app.android.arret.java.activity.DownloadJSON.doInBackground(DownloadJSON.java:24)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
Измените модульное тестирование, чтобы содержать больше событий в EventList? – agilob
Причина - ваша функция никогда не возвращалась и не становилась все глубже и глубже. Проверьте логику метода – Alexander
Возможный дубликат [Метод сортировки по дате Java?] (Http://stackoverflow.com/questions/2786379/java-date-sorting-method) – jobbert