二维数组上的ArrayIndexOutOfBoundsException错误

时间:2018-02-12 19:08:59

标签: java arrays indexoutofboundsexception

我想检查我的two-dimensional数组的每个位置附近的第8个位置,但是第一个位置给我错误,因为那里没有位置。

如何避免该错误?我过去也发生过同样的事情,我也无法解决这个问题。

我想要做的示例图片:

enter image description here

我的方法代码:

 private static void evoluciona(char[][] tauler2, char[][] tauler22) {

        for(int i = 0; i < files; i++) {
            for(int j = 0; j < columnes; j++) {
                tauler2[i][j] = tauler[i][j];
            }
        }

        for(int i = 0; i < files; i++) {
            for(int j = 0; j < columnes; j++) {
                if(tauler2[i][j] == 'x') {

                    int cont = 0;

                    if(tauler2[i-1][j] == '*') {
                        cont++;
                    }

                    if(tauler2[i-1][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i-1][j+1] == '*') {
                        cont++;
                    }

                    if(tauler2[i][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j+1] == '*') {
                        cont++;
                    }

                    if(tauler2[i][j+1] == '*') {
                        cont++;
                    }

                    if(cont == 2 || cont == 3) {
                        tauler2[i][j] = '*';
                    }
                }

                else if(tauler2[i][j] == '*') {

                    int cont = 0;

                    if(tauler2[i-1][j] == '*') {
                        cont++;
                    }

                    if(tauler2[i-1][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i-1][j+1] == '*') {
                        cont++;
                    }

                    if(tauler2[i][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j-1] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j] == '*') {
                        cont++;
                    }

                    if(tauler2[i+1][j+1] == '*') {
                        cont++;
                    }

                    if(tauler2[i][j+1] == '*') {
                        cont++;
                    }

                    if(cont == 2 || cont == 3) {
                        tauler2[i][j] = '*';
                    }

                    else {
                        tauler2[i][j] = 'x';
                    }
                }
            }
        }   
    }

4 个答案:

答案 0 :(得分:2)

在圣诞节期间编写我自己的小扫雷克隆时,我遇到了类似的问题。

我最终得到了一个了解其邻居的字段类。

class Field {
    char value;
    Field[] neighbors;
}

每当初始化一块新板时,那些“连接”都是预编译的。

class FieldManager {

    void initializeFields(int firstDimension, int secondDimension) {
        fields = new Field[firstDimension][secondDimension];
        for(int i = 0; i < fields.length; i++) {
            for(int j = 0; j < fields[i].length; j++) {
                fields[i][j] = new Field();
                fields[i][j].neighbors = neighborsFor(i, j);
            }
        }
    }

    private Field[] neighborsFor(int iIn, int jIn) {
        List<Field> result = new ArrayList<>();
        for(int i = iIn - 1; i <= iIn + 1; i++) {
            for(int j = jIn - 1; j < jIn + 1; j++)
                // do some range checks and fill result
            }
        }
        return result.toArray(new Field[result.size()]);
    }

    Field[][] fields;
}

您可以使用Collection来代替数组,例如ArrayList。特别是较新的java版本具有围绕这些接口构建的许多有用的实用程序。

答案 1 :(得分:1)

我建议明确检查边界! 修改你的if语句,这样每当你有i+1j+1,你就检查它是不是太大(i < filesj < columnes),{{1} },i-1他们不是0(j-1i > 0)。

当你计算邻近的星星时,如果你在边境,这种方法不会增加额外的星星。

或者,&#34;懒惰的方式&#34;,你可以在内循环内j > 0

答案 2 :(得分:1)

在所有索引为i-1或j-1的地方,在任一循环(i或j)的第一次迭代中,根据堆栈跟踪中的异常,您可以得到-1的索引,这会导致try{} catch(ArrayOutOfBoundsException e) { continue; }

不要抓住它并忽略它,在做任何事之前在可能导致此异常的区域周围放置一个if。

ArrayIndexOutOfBoundsException

同样在// your code ... if (i - 1 >= 0) { if(tauler2[i-1][j] == '*') { cont++; } } ... 的情况下,对tauler2[i][j-1]进行条件检查。

答案 3 :(得分:1)

您正在访问不在数组中的索引。当你开始forloops i-e i = 0和j = 0时,如果条件u r使用索引为[i-1]和[j-1]。在这里你得到索引越界的例外。消除或改变这些条件。