Java 不确定为什么会发生越界异常

Java 不确定为什么会发生越界异常,java,debugging,arraylist,indexoutofboundsexception,Java,Debugging,Arraylist,Indexoutofboundsexception,获取越界异常,但不了解原因。我的递归函数每次从数组列表中删除一个项时都会调用自己,直到其为空。一旦该行为空,则应填充该行,然后将值添加回列表。我认为在最后一个元素上,由于列表的长度,它抛出了一个异常,它不想删除最后一个元素。这有什么办法吗?有没有可能是另一个错误 import java.util.Arrays; import java.util.Collections; import java.util.Random; import java.util.*; class Main { publ

获取越界异常,但不了解原因。我的递归函数每次从数组列表中删除一个项时都会调用自己,直到其为空。一旦该行为空,则应填充该行,然后将值添加回列表。我认为在最后一个元素上,由于列表的长度,它抛出了一个异常,它不想删除最后一个元素。这有什么办法吗?有没有可能是另一个错误

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;
}
导入java.util.array;
导入java.util.Collections;
导入java.util.Random;
导入java.util.*;
班长{
公共静态void main(字符串[]args){
int[][]板=新int[9][9];
解算器解算=新解算器();
ArrayList选项=新建ArrayList();
addAll(Arrays.asList(1,2,3,4,5,6,7,8,9));
收藏。洗牌(选择);
对于(int i=0;i<9;i++){
对于(int j=0;j<9;j++){
求解.填充(板,选项,i,j);
}
}
}
}
类求解器{
公共空白填充(int板[][],阵列列表选项,int
行,整数列){
int num=choices.remove(0);
if(isValid(板、行、列、数)=false){
填充(板、选项、行、列);
}否则
板[行][列]=num;
返回;
}
公共布尔值是有效的(int board[],int row,int col,int num){
如果(检查行(线路板、行、列、数量)=真)
/*检查列(板、行、列、数)==真)*/
/*checkSqr(板、行、列、数)=真*/
返回true;
返回false;
}
公共布尔校验行(int BOUND[]],int row,int col,int num){
布尔有效=真;
int i=0;
而(i<9){
如果(板[i][col]==num){
返回valid=false;
}
i++;
}
返回有效;
}
预期结果将是根据数独规则随机填充board[][]。 相反,我们得到了 线程“main”java.lang.IndexOutOfBoundsException中的异常: 索引0超出长度0的界限 at Solver.fill(Solver.java:31)
在Main.Main(Solver.java:22)

中,在调用
int num=choices.remove(0);
之前,请确保您仍然有一个元素


不相关的问题:如果同时导入
java.util
中的每一样东西,为什么要按名称导入
Array
Collections
Random
if (choices.isEmpty()) {
    return;
}
int num = choices.remove(0);