Android - ArrayIndexOutOfBoundsException错误

时间:2015-01-12 23:51:29

标签: java android indexoutofboundsexception

我查看了有这个问题的其他帖子,但它们似乎与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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您有2个不同的Thread同时呼叫push

当第一个完成push的执行时,它将arr替换为temp_arr,其长度为1。

当第二个到达temp_arr[arr.length][0]时,会出现索引错误,因为arr的大小与temp_arr初始化时的大小不同。

为了防止这种情况发生,您可以使用ExecutorService在同一个Runnable上同时运行多个Threadhttp://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 ”。