2015-01-12 3 views
0

Я смотрел на другие сообщения с этой проблемой, но они, похоже, имеют какое-то соединение с полем editText или отключены одной ошибкой. В моем случае ни одно из решений других должностей, похоже, не помогает. Вот мой код:Android - ArrayIndexOutOfBoundsException error

public void push(int w, int h) { 
    int[][] temp_arr = new int[arr.length+1][2]; 
    for (int i=0; i<arr.length; i++) { 
     temp_arr[i][0] = arr[i][0]; 
     temp_arr[i][1] = arr[i][1]; 
    } 
    temp_arr[arr.length][0] = w; // happens here 
    temp_arr[arr.length][1] = h; 
    arr = temp_arr; 
} 

Вот сообщение об ошибке:

Process: <package name>, PID: 16749 
java.lang.ArrayIndexOutOfBoundsException: length=76; index=76 

Как я могу это исправить?

+0

Вы уверены, что это произошло? есть ли какие-нибудь потоки, которые будут изменять 'arr'? – njzk2

ответ

1

У вас есть 2 разных Thread s, вызывающих push в то же время.

Когда первый один завершает выполнение push, он заменяет arr с temp_arr, который больше на 1.

Когда второй достигает temp_arr[arr.length][0], есть ошибка индекса, так как размер arr не то же самое как при инициализации temp_arr.

Чтобы предотвратить это, вы можете либо использовать ExecutorService запустить несколько Runnable с на том же Thread, серийно: http://developer.android.com/reference/java/util/concurrent/Executors.html#newSingleThreadExecutor%28%29

или вы можете добавить synchronized блок:

public synchronized void push(int w, int h) { 
    // ... 
} 
0

Есть некоторые темы продолжаются.

Решение: Вы должны убедиться, что некоторые действия должны быть синхронизированный

public synchronized void push(int w, int h) { 
    int[][] temp_arr = new int[arr.length+1][2]; 
    for (int i=0; i<arr.length; i++) { 
     temp_arr[i][0] = arr[i][0]; 
     temp_arr[i][1] = arr[i][1]; 
    } 
    temp_arr[arr.length][0] = w; // happens here 
    temp_arr[arr.length][1] = h; 
    arr = temp_arr; 
} 

А может быть, у вас есть еще одна функция, которая «поп» данные «обр». Если у вас есть эта функция, добавьте «синхронизированный».

public synchronized int pop(int w, int h) { 
    // 
} 

Или другой способ:

public void push(int w, int h) { 
    synchronized(arr) { 
     int[][] temp_arr = new int[arr.length+1][2]; 
     for (int i=0; i<arr.length; i++) { 
      temp_arr[i][0] = arr[i][0]; 
      temp_arr[i][1] = arr[i][1]; 
     } 
     temp_arr[arr.length][0] = w; // happens here 
     temp_arr[arr.length][1] = h; 
     arr = temp_arr; 
    } 
} 

И, пожалуйста, убедитесь, что функция "поп", вы должны синхронизировать "обр" тоже.

+0

http://www.tutorialspoint.com/java/java_thread_synchronization.htm вот пример о "синхронизированном" – Luc

Смежные вопросы