我查看了有这个问题的其他帖子,但它们似乎与editText
字段有某种连接或者有一个错误。就我而言,其他帖子的解决方案似乎都没有帮助。这是我的代码:
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 :(得分:1)
您有2个不同的Thread
同时呼叫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) {
// ...
}
答案 1 :(得分: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;
}
}
请确保“ pop ”功能,您还必须同步“ arr ”。