【问题标题】:ArrayIndexOutOfBoundsException error on two-dimensional array [duplicate]二维数组上的ArrayIndexOutOfBoundsException错误[重复]
【发布时间】:2018-02-12 19:08:58
【问题描述】:

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

如何避免该错误?我以前也遇到过同样的情况,我也解决不了。

我想要做的示例图片:

我的方法代码:

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

【问题讨论】:

  • 忽略异常并不能解决问题。
  • 确实可以...
  • @Idos 您将教育问题误认为是代码问题。隐藏异常将允许代码在边界情况下运行,但这无助于 OP 了解他的代码在做什么。正如他明确提到的,他以前遇到过这类问题,但不知道如何解决。 Stack Overflow 是关于学习的,而不是“为我修复代码”。

标签: java arrays indexoutofboundsexception


【解决方案1】:

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

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

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

您也可以使用Collections 来代替数组,例如ArrayList。尤其是较新的 Java 版本围绕这些接口构建了许多有用的实用程序。

【讨论】:

    【解决方案2】:

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

    当您计算相邻的星星时,如果您在边界上,此方法不会添加额外的星星。

    或者,“懒惰的方式”,你可以在内部循环中try{} catch(ArrayOutOfBoundsException e) { continue; }

    【讨论】:

    • “try{} catch(ArrayOutOfBoundsException e) { continue; }”成功了!非常感谢!
    • 在某些情况下忽略异常是适当的做法,但我想说这种情况很少见(或者可能不存在越界异常)。忽略异常通常是一种不好的做法,新开发人员应该避免这种做法,而是专注于理解异常的原因并学习如何编写代码以正确避免它。 @Óscar73
    【解决方案3】:

    在所有索引为 i-1 或 j-1 的地方,在任一循环(i 或 j)的第一次迭代中,根据堆栈跟踪中的异常,您可以拥有 -1 的索引,这会导致ArrayIndexOutOfBoundsException

    不要捕获它并忽略它,而是在执行任何操作之前在可能导致此异常的区域周围放置一个 if。

    // your code
    ...
    
    if (i - 1 >= 0) {
        if(tauler2[i-1][j] == '*') {
            cont++;
        }
    }
    
    ...
    

    同样在tauler2[i][j-1] 的情况下,对j - 1 &gt;= 0 进行条件检查。

    【讨论】:

      【解决方案4】:

      您正在访问这样一个不在数组中的索引。当您开始 forloops i-e i=0 和 j=0 时,并且在 if 条件下,您使用 [i-1] 和 [j-1] 的索引。在这里,您遇到了索引超出范围的异常。消除或改变这些条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多