2015-01-12 44 views
0

我看着其他職位與此問題,但他們似乎有某種連接到editText字段或關閉一個錯誤。就我而言,其他帖子的解決方案似乎沒有任何幫助。這裏是我的代碼:Android - ArrayIndexOutOfBoundsException錯誤

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執行,它取代arrtemp_arr,這是通過較長1

當第二到達temp_arr[arr.length][0],存在的索引差錯由於arr大小是不一樣的當temp_arr被初始化。

爲了防止這種情況,你可以使用一個ExecutorService在同Thread運行多個Runnable S,串行:http://developer.android.com/reference/java/util/concurrent/Executors.html#newSingleThreadExecutor%28%29

,或者你可以添加一個​​塊:

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; 
} 

也許你有另外一個新功能「彈出」數據來自「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; 
    } 
} 

並請確保 「彈出」 功能,必須同步ARR」 也。

+0

http://www.tutorialspoint.com/java/java_thread_synchronization.htm這裏是關於「synchronized」的例子 – Luc

相關問題