【问题标题】:Array index out of bounds? How?数组索引超出范围?如何?
【发布时间】:2013-09-06 11:31:50
【问题描述】:

你好 stackoverflow 的好人! 我有一个奇怪的问题,我无法理解。 我将发布我的两种有问题的方法:

private static void resi(int [][] matrica,int row, int col) {
    if (matrica[row][col] != 0) {
        next(matrica,row, col); // <--- this the line that first throws the exception
    } else {
        for (int num = 1; num < 10; num++) {
            if (checkRow(matrica,row, num) && checkColumn(matrica,col, num) && checkBox(matrica,row, col, num)) {
                matrica2[row][col] = num;
                matrica4[row][col] = num;
                next(matrica,row, col);
            }
        }
        matrica[row][col] = 0;

    }
}

还有一个:

 private static void next(int [][] matrica2,int row, int col) {
    if (col < 8) {
        resi(matrica2,row, col + 1);
    } else {
        resi(matrica2,row + 1, 0);
    }
}

所以,我正在根据我在网上找到的一些代码制作数独求解器。 现在,当我尝试调试程序时,我可以很好地检查一些行(并且它按预期工作)但是一旦程序第一次到达方法“resi”中对“next”方法的调用,它就会崩溃并出现数组索引边界异常。 如果我只是尝试在不调试的情况下运行程序,我会在 NetBeans 的输出选项卡中一遍又一遍地在同一个方法调用中得到很多“数组索引越界”异常。

我不知道是什么导致了这个错误。据我所知, row 和 col 不超过 0-8 范围......这一定是二维数组的问题? 感谢您的宝贵时间。

编辑 1:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9 
at SudokuGame.Main.resi(Main.java:88)
    at SudokuGame.Main.next(Main.java:107)
    at SudokuGame.Main.resi(Main.java:89)
    at SudokuGame.Main.next(Main.java:105)
    at SudokuGame.Main.resi(Main.java:95)

...等等,它们正在重复,因为它似乎正在遍历代码并不断抛出异常?

【问题讨论】:

  • 你能告诉我们数组的初始化吗?
  • 您能否也标记出有异常的确切行。如果你这样做,我认为你可以保证几乎是即时的解决方案。干杯。
  • 顺便说一句,resi-method 中的 matrica2 和 matrica4 是什么?
  • 粘贴stracktrace
  • 提示:1) 添加@JohnnyAW(或重要的@)以通知他们有新评论。 2) 发布 SSCCE。

标签: java arrays indexoutofboundsexception sudoku backtracking


【解决方案1】:

next() 中,您一直在递增row,但没有像row 那样对row 进行故障安全索引越界检查,因此不能保证row 会超过值大于 8 即 9。

所以,在resi(matrica2,row + 1, 0); 行中递增 (row+1) 之前,请务必检查 row 是否小于 8。

private static void next(int [][] matrica2,int row, int col) {
if (col  8) {
    resi(matrica2,row, col + 1);
} else if(row < 8) { // Make sure to increment row only if less than 8
    resi(matrica2,row + 1, 0);
} else {
    // Stop the application (May Be)
 }

}

【讨论】:

  • 我想你可能会有所作为。我只是注意到我没有办法让求解器停止求解,即最终将“行”带到 8 以上。我会尝试修复它,我会在这里发布。
  • 好吧,现在异常停止发生了。哪个好。但该程序现在无限期运行。我写了一行应该打印出 matrica4,但它从来没有。同样,当我尝试调试时,它到达第一个“下一个”调用,当我按 F8(跳过)时,它不再给我使用 F8 的选项,就像它禁用它一样,因为它正在做一些我无法中断的事情。
  • 显然,当所有的行和列都解决了next() method as in answer 时,什么都不做,因此应用程序进入无限循环。正如我建议的那样,您可以在else block in next() 中设置停止应用程序的逻辑或尝试在那里设置断点。此外,如果您已经解决了超出范围的错误,最好关闭此问题。
  • 需要注意的是,应用程序本质上是递归的,因此需要一个断点(退出递归的情况)。可能的断点是else block in next()
  • 它说我应该避免 cmets 说“谢谢”,但我必须感谢你的帮助。
【解决方案2】:

Execption 会准确说明问题发生在哪一行。查看代码,我猜想在一些next 调用之后,resi 方法的第三行(next(matrica,row, col);)将抛出执行,因为它错过了对该行的一些验证。为了我们确保,将执行粘贴到诸如 pastebin.com 之类的网站上,并在此处通知我们看到它 =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多