Я сталкиваюсь с ArrayIndexOutOfBoundsException при сортировке. мой код здесь:
Collections.sort(mutualFriends, new Comparator<FriendInfo>() {
public int compare(FriendInfo s1, FriendInfo s2) {
return s1.name.compareToIgnoreCase(s2.name);
}
});
Журналы здесь:
STACK_TRACE=java.lang.ArrayIndexOutOfBoundsException
at java.util.Collections.sort(Collections.java:1970)
at com.platinumapps.fragments.Mutual_Friends_Fragment$1.onComplete(Mutual_Friends_Fragment.java:138)
at com.platinumapps.facedroid.AsyncRequestListener.onComplete(AsyncRequestListener.java:59)
at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:328)
А мой общий список друзей такой:
private List<FriendInfo> mutualFriends = new ArrayList<FriendInfo>();
Любая идея исправить эту проблему. Заранее спасибо.
1 ответ
Скорее всего, здесь у вас гонка за данными .
Другой поток пытается изменить список во время его сортировки (или доступа) - и вы получаете состояние гонки, которое в вашем случае вызывает IndexOutOfBoundsException
.
Трудно понять, в чем именно заключается проблема, но есть несколько общих способов ее решения:
- Убедитесь, что ваш код потокобезопасен. Это легко сделать с помощью
synchronized
ing наArrayList
объект везде, где это есть быть использованным - - Используйте класс, предназначенный для обеспечения безопасности потоков.
Распространенная ошибка, которая может быть проблемой в вашем случае, - это порождение потоков, а не ожидание, пока они закончат свою работу перед сортировкой. Это можно решить, просто вызвав join()
во всех потоках, прежде чем предполагать, что они завершены - это гарантирует, что вы не продолжите, пока все потоки не будут завершены.
synchronized(mutualFriends)
перед каждой точкой использования списка решит проблему (хотя и с очень плохой производительностью), но, как я также сказал, без дополнительного кода нельзя быть уверенным.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
mutualFriends
пуст?Mutual_Friends_Fragment.java:138
mutualFriends
одновременно во время сортировки? (Или, другими словами: есть ли у вас какие-либо многопоточные задания в коде, который имеет дело с этим списком)?Collections.sort
вызвать подобное исключение - это если какой-то другой код вытащит почву из-под него. Если у вас есть несколько потоков, обращающихся кmutualFriends
, вам необходимо синхронизировать доступ.