2015-03-28 4 views
0

Я пытаюсь отлаживать несколько кода и дает одновременное изменение за исключениемИзбегайте одновременного исключения модификации

код

final GestureLibrary store1 = GestureLibraries.fromFile(new File(Environment.getExternalStorageDirectory(), "Gesture_launcher")); 

    if (store1.load()) 
    { 
     for (String name : store1.getGestureEntries()) 
     { 
      for (Gesture gesture : store1.getGestures(name)) 
      { 
       if(name.contains(gesture_name)) 
       { 
        store1.removeGesture(name, gesture); 
        store1.addGesture(name, mGesture); 
        store1.save(); 

        Toast.makeText(getApplicationContext(), getResources().getString(R.string.saved), Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 

Выполнение выше утверждение дает ConcurrentModificationException

LogCat

03-28 02:47:45.422: E/AndroidRuntime(449): FATAL EXCEPTION: main 
03-28 02:47:45.422: E/AndroidRuntime(449): java.util.ConcurrentModificationException 
03-28 02:47:45.422: E/AndroidRuntime(449): at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796) 
03-28 02:47:45.422: E/AndroidRuntime(449): at java.util.HashMap$KeyIterator.next(HashMap.java:823) 
03-28 02:47:45.422: E/AndroidRuntime(449): at com.likith.gesturebuilder.change_gestures.setGestures(change_gestures.java:69) 
03-28 02:47:45.422: E/AndroidRuntime(449): at com.likith.gesturebuilder.change_gestures$1.onClick(change_gestures.java:110) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.view.View.performClick(View.java:2485) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.view.View$PerformClick.run(View.java:9080) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Handler.handleCallback(Handler.java:587) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.os.Looper.loop(Looper.java:123) 
03-28 02:47:45.422: E/AndroidRuntime(449): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-28 02:47:45.422: E/AndroidRuntime(449): at java.lang.reflect.Method.invokeNative(Native Method) 
03-28 02:47:45.422: E/AndroidRuntime(449): at java.lang.reflect.Method.invoke(Method.java:507) 
03-28 02:47:45.422: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-28 02:47:45.422: E/AndroidRuntime(449): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-28 02:47:45.422: E/AndroidRuntime(449): at dalvik.system.NativeStart.main(Native Method) 

Сообщать любой метод о том, как избежать этого eption Спасибо вы

РЕДАКТИРОВАНИЕ 1: Теперь я изменил код

List<Gesture> list = store1.getGestures(gesture_name); 
     Set<String> List_name = store1.getGestureEntries(); 

     for (String name : List_name) 
     { 
      for (Gesture gesture : list) 
      { 
       if(name.contains(gesture_name)) 
       { 
        store1.removeGesture(name, gesture); 
        store1.addGesture(name, mGesture); 
        store1.save(); 

        Toast.makeText(getApplicationContext(), getResources().getString(R.string.saved), Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 

Опять же это дает мне ту же ошибку.

+0

Вы можете переключиться с расширенным циклом для регулярного цикла –

+0

как сделать. –

ответ

2

Вы перебираете store1.getGestures(), в то же время вы вызываете store1.removeGesture() и store1.addGesture().

Попробуйте скопировать массив жестов и закольцовать копию.

Array<Gesture> newArray = new Array<>(); 
newArray.addAll(store1.getGestures(name)); 
for (Gesture gesture : newArray) 
     { 
      if(name.contains(gesture_name)) 
      { 
       store1.removeGesture(name, gesture); 
       store1.addGesture(name, mGesture); 
       store1.save(); 
... 
0

Простым способом избежать исключений при одновременной модификации является использование регулярного цикла.

При использовании эхо-сигналов для петель используется итератор. При использовании итератора вы не можете изменять коллекцию.

регулярный цикл выглядит следующим образом

List<String> list; 

for(int i = 0; i < list.size(); i++) { 
    String string = list.get(i); 
    //use string 
} 

В отличии от использования расширенного цикла, который выглядит следующим образом

List<String> list; 

for(String string : list) { 
    //use string 
} 
Смежные вопросы