Java 数组索引超出范围?怎样
大家好,这里的人们! 我有一个奇怪的问题,我不明白。 我将发布两个有问题的方法:Java 数组索引超出范围?怎样,java,arrays,indexoutofboundsexception,sudoku,backtracking,Java,Arrays,Indexoutofboundsexception,Sudoku,Backtracking,大家好,这里的人们! 我有一个奇怪的问题,我不明白。 我将发布两个有问题的方法: 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
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;
}
}
。。。以此类推,它们在重复,因为它似乎正在遍历代码并不断抛出异常?执行选项将确切地说明问题发生在哪一行。查看代码,我猜在一些
next
调用之后,resi
方法的第三行(next(matrica,row,col);
)将抛出execption,因为它错过了行的一些验证。为了确保我们的安全,请将执行选项粘贴到一些网站上,如pastebin.com,并通知此处,以便我们在next()
中看到它=)您一直在增加行
,但没有对行
进行故障安全索引越界检查,就像对列
进行检查一样,因此不能保证行
将超过大于8的值,即9
因此,在第行resi(矩阵2,行+1,0)中递增(行+1
)之前,确保检查行
是否小于8代码>
private static void next(int[][]矩阵2,int行,int列){
如果(第8栏){
resi(矩阵2,行,列+1);
}否则,如果(行<8){//请确保仅当小于8时才增加行数
resi(矩阵2,行+1,0);
}否则{
//停止应用程序(可能是)
}
}您能给我们看一下阵列的初始化吗?您也能标记出有异常的那一行吗。我认为,如果你这样做,你可以保证一个几乎即时的解决方案。Cheers.btw resi方法中的matrica2和matrica4是什么?粘贴stracktraceTips:1)添加@JohnnyAW(或任何人,@
很重要)以通知他们新的评论。2) 发个短信,我想你可能在搞什么鬼。我只是注意到我没有办法让解算器停止解算,这最终会使“行”超过8。我会尝试修复它,然后我会在这里发布。好吧,现在异常停止发生了。这很好。但是这个程序现在正在无限期地运行。我写了一行应该打印出matrica4,但从来没有。同样,当我尝试调试它时,它到达第一个“next”调用,当我按F8(单步执行)时,它不再给我使用F8的选项,就像它禁用它,因为它正在做一些我无法中断的事情。显然,当所有行和列都完成时,解决next()方法,如在answer
中所示,不执行任何操作,因此应用程序进入无限循环。正如我所建议的,您可以在next()中的else块中放置停止应用程序的逻辑,或者尝试在那里设置断点。另外,如果您已经解决了越界错误,那么最好结束这个问题。需要注意的是,应用程序本质上是递归的,因此需要一个断点(脱离递归的情况)。可能的断点是next()
中的else块。它说我应该避免说“谢谢”的评论,但我必须感谢您的帮助。
private static void next(int [][] matrica2,int row, int col) {
if (col < 8) {
resi(matrica2,row, col + 1);
} else {
resi(matrica2,row + 1, 0);
}
}
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)
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)
}