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

标签 java debugging arraylist indexoutofboundsexception

出现越界异常,但不明白为什么。每次从数组列表中删除一个项目直到其为空时,我的递归函数都会调用自身。一旦它为空,就应该填充该行,然后我们将值添加回列表中。我认为在最后一个元素上它会因为列表长度而引发异常,它不想删除最后一个元素。有没有办法解决?有没有可能是一个不同的错误?

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”中的异常 java.lang.IndexOutOfBoundsException: 索引 0 超出长度 0 的范围 在 Solver.fill(Solver.java:31) 在 Main.main(Solver.java:22)

最佳答案

在调用int num = Choices.remove(0);之前确保您仍然有一个元素,您可以使用List.isEmpty()喜欢

if (choices.isEmpty()) {
    return;
}
int num = choices.remove(0);

关于java - 不确定为什么会发生越界异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58046486/

相关文章:

java - 无法使用任何调试器连接到 Glassfish

php - visual studio 代码 PHP 调试不起作用

java - 在 Java 中的 Hashmap 中使用过去的数据和 ArrayList 的当前数据

java - sqlite 查询返回列名和字符串

java - 一个方法在 JUnit 中生成了预期的结果,但它说它是 null

java - gradle集成测试不起作用,单元测试运行两次

c++ - Debug模式或 Release模式

java - 需要使用Java RMI创建发布者-订阅者

java - 设置 XY 图上点标签的格式

java - 帮助解决一个简单的 Android ListView 问题