Ich habe eine rekursive Funktion, die eine Liste von Ereignissen nimmt und sie nach ihrem Datum sortiert. Es hat gut funktioniert, aber heute habe ich einen Absturzbericht auf der Google Play Developer Console erhalten. Ein StackOverflowError wird ausgelöst.StackOverflowError beim rekursiven Sortieren von Daten
Also, meine Frage ist, weiß jemand, warum das passiert und was zu tun, um es zu vermeiden?
Meine Sortierfunktion:
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;
}
}
Stapelüberwachung:
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)
Ändern Sie bitte Ihre Unit-Test mehr Veranstaltungen in Eventlist enthalten? – agilob
Ursache ist Ihre Funktion ist nie zurückgekehrt und tiefer und tiefer. Überprüfen Sie die Logik der Methode – Alexander
Mögliche Duplikate von [Java Datum Sortiermethode?] (Http://stackoverflow.com/questions/2786379/java-date-sorting-method) – jobbert