数组索引超出范围?如何?
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 之类的网站上,并在此处通知我们看到它 =)
【讨论】:
以上是关于数组索引超出范围?如何?的主要内容,如果未能解决你的问题,请参考以下文章
如何修复此 System.IndexOutOfRangeException:索引超出数组范围