排序List时的ArrayIndexOutOfBoundsException

时间:2013-01-16 07:21:36

标签: java

我在排序中面临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 个答案:

答案 0 :(得分:5)

您最有可能在此处进行数据竞赛

其他一些线程会在对列表进行排序(或访问)时尝试修改列表 - 并且您会遇到竞争条件,这会导致IndexOutOfBoundsException

很难知道问题究竟在哪里,但解决问题的一些通用方法是:

  1. 确保您的代码是线程安全的。它可以很容易地完成 ArrayList对象synchronizeding到处都是join() 正在使用 -
  2. 使用专为线程安全而设计的类。
  3. 在您的情况下可能出现问题的常见错误是产生线程,而不是在排序之前等待它们完成工作。这可以通过在假设它们完成之前在所有线程上调用{{3}}来解决 - 这可以确保在所有线程完成之前不会继续。