-3

並べ替えで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>();

この問題を修正するためのアイデア。前もって感謝します。

4

1 に答える 1

5

あなたはおそらくここでデータ競争をしているでしょう。

他のスレッドは、リストがソートされている(またはアクセスしている)ときにリストを変更しようとします-そして、競合状態が発生します。これにより、あなたの場合はIndexOutOfBoundsException

問題がどこにあるかを正確に知ることは困難ですが、それを解決するためのいくつかの一般的な方法は次のとおりです。

  1. コードがスレッドセーフであることを確認してください。使用されているすべての場所でオブジェクトを実行synchronizedすること で、簡単に実行できます -ArrayList
  2. スレッドセーフ用に設計されたクラスを使用してください。

あなたの場合に問題となる可能性のある一般的なバグは、スレッドを生成し、ソートする前にスレッドが作業を終了するのを待たないことです。これは、すべてのスレッドが完了すると想定する前に、すべてのスレッドを呼び出すだけで解決できますjoin()。これにより、すべてのスレッドが完了するまで続行しないようになります。

于 2013-01-16T07:39:55.213 に答える