1

I'm doing a very simple "filter" on an ArrayList, which is occassionally throwing a ConcurrentModifificationException, but AFAICT there's no modification happening... The code is pretty straightforward...

public ArrayList<JSONObject> getContributionsByInstallation(int installationID, ArrayList<JSONObject> list){
    ArrayList<JSONObject> filtered = new ArrayList<JSONObject>();
    for(JSONObject object : list) {
        try {
            int fk = object.getInt("exhibit_fk");
            if(fk == installationID){
                filtered.add(object);
            }
        } catch(JSONException e){

        }
    }
    return filtered;
}

What am I missing?

/EDIT: adding stack trace

07-12 12:39:24.135: E/AndroidRuntime(2350): FATAL EXCEPTION: main
07-12 12:39:24.135: E/AndroidRuntime(2350): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.whatever.light/com.whatever.light.InstallationDetailActivity}: java.util.ConcurrentModificationException
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.os.Looper.loop(Looper.java:130)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread.main(ActivityThread.java:3691)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at java.lang.reflect.Method.invokeNative(Native Method)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at java.lang.reflect.Method.invoke(Method.java:507)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at dalvik.system.NativeStart.main(Native Method)
07-12 12:39:24.135: E/AndroidRuntime(2350): Caused by: java.util.ConcurrentModificationException
07-12 12:39:24.135: E/AndroidRuntime(2350):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:576)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.whatever.light.data.ContributionsData.getContrubtionsByInstallation(ContributionsData.java:81)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.whatever.light.data.ContributionsData.getRandomCommentContribution(ContributionsData.java:62)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.whatever.light.installations.ContributeCommentModuleFragment.showComment(ContributeCommentModuleFragment.java:102)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at com.whatever.light.installations.ContributeCommentModuleFragment.onCreateView(ContributeCommentModuleFragment.java:86)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:844)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1053)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1371)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:499)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.Activity.performStart(Activity.java:3817)
07-12 12:39:24.135: E/AndroidRuntime(2350):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1624)
07-12 12:39:24.135: E/AndroidRuntime(2350):     ... 11 more
4
  • 1
    can you paste your stack trace? Commented Jul 12, 2012 at 17:50
  • 6
    seemingly the passed ArrayList<JSONObject> list is modified by another thread while iterating, you should make a copy of it using new ArrayList<JSONObject>(list); Commented Jul 12, 2012 at 17:50
  • see this Commented Jul 12, 2012 at 17:52
  • @s106mo that makes sense and appears to work - if you post your comment as an answer I'll accept it Commented Jul 12, 2012 at 17:57

2 Answers 2

1

Almost certainly, another thread is modifying the object referred to by list -- this method isn't. Look for all possible ways this could be happening.

Sign up to request clarification or add additional context in comments.

Comments

0

You can also use CopyOnWriteArrayList to avoid concurrentModificationException.. you can refer to this link which illustrates arrayList and CopyOnWriteArrayList..

http://techvivek.wordpress.com/2009/08/29/difference-between-arraylist-and-copyonwritearraylist/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.