java - 不确定为什么会发生越界异常
问题描述
得到一个越界异常,但不明白为什么。每次从数组列表中删除一个项目直到它为空时,我的递归函数都会调用自己。一旦它为空,该行应该被填充,然后我们将值添加回列表中。我认为在最后一个元素上它会因为列表长度而引发异常,它不想删除最后一个元素。有没有办法解决?有没有可能是一个不同的错误?
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
import java.util.*;
class Main {
public static void main(String[] args) {
int[][]board=new int[9][9];
Solver solve = new Solver();
ArrayList<Integer> choices = new ArrayList<>();
choices.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9));
Collections.shuffle(choices);
for(int i = 0; i < 9; i++){
for(int j=0; j < 9; j++) {
solve.fill(board, choices, i, j);
}
}
}
}
class Solver {
public void fill(int board[][], ArrayList<Integer> choices, int
row, int col) {
int num = choices.remove(0);
if (isValid(board, row, col, num) == false) {
fill(board, choices, row, col);
} else
board[row][col] = num;
return;
}
public boolean isValid(int board[][], int row, int col, int num) {
if (checkRow(board, row, col, num) == true)
/*checkCol(board, row, col, num) == true)*/
/*checkSqr(board, row, col, num) == true*/
return true;
return false;
}
public boolean checkRow(int board[][], int row, int col, int num) {
boolean valid = true;
int i = 0;
while (i < 9) {
if (board[i][col] == num) {
return valid = false;
}
i++;
}
return valid;
}
预期结果将是根据数独规则随机填充棋盘 [][]。相反,我们在 Main.main(Solver.java:22) 处的 Solver.fill(Solver.java:31) 处的线程“main” java.lang.IndexOutOfBoundsException 中得到 Exception: Index 0 out of bounds for length 0
解决方案
在调用之前确保你仍然有一个元素,int num = choices.remove(0);
你可以使用List.isEmpty()
like
if (choices.isEmpty()) {
return;
}
int num = choices.remove(0);
推荐阅读
- javascript - 在 React.js 上验证电话号码
- html - CSS:如何按类设置内容?
- javascript - 点击提交按钮后,会出现一张卡片,显示我提交的信息,但问题是它只显示几秒钟
- continuous-integration - 与使用 trigger 关键字相比,Gitlab-CI api 触发器有什么优势吗?
- java - 键盘出现时使整个布局变小
- c# - 以 xamarin 形式捕获照片
- android - 在 Android Studio 3.5.3 中构建时仅生成 -debug.apk 文件
- c++ - constexpr 指向 C++17 中的 constexpr 静态成员的指针
- flutter - 带有 Flutter 包的 Web 功能:mapbox_gl
- arrays - Flutter如何在堆栈中显示图像