数组索引超出范围?如何?

Posted

技术标签:

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

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

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。 【参考方案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 之类的网站上,并在此处通知我们看到它 =)

【讨论】:

以上是关于数组索引超出范围?如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中记录超出范围的数组索引?

如何修复此 System.IndexOutOfRangeException:索引超出数组范围

如何解决 uiTableview 滚动应用程序崩溃,它会在 swift 中引发数组索引超出范围异常?

如何在 Swift 中检查我的数组索引是不是超出范围

错误:索引超出了数组的范围。 [复制]

数组索引超出范围