当前位置: 首页 > 知识库问答 >
问题:

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

龚运乾
2023-03-14

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

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中得到异常:在main.main(Solver.java:22)的solver.fill处(solver.java:31)处,长度为0的索引0越界

共有1个答案

皇甫展
2023-03-14

在调用int num=choices.remove(0)之前,请确保仍然有一个元素;可以使用list.isempty()

if (choices.isEmpty()) {
    return;
}
int num = choices.remove(0);
 类似资料:
  • 我编写了这段代码,将整个以10为基数的数字转换成二进制。我相信代码就是它所需要的一切,但我无法让工作。 我在这个网站和其他网站上花了几个小时,尝试了无数次的修改,但都没有用。 我已经让代码无错误地编译,但一旦我运行它并输入程序就会崩溃。 下面是代码: 这些是java在我输入数字时抛出的异常。 我希望这是足够的信息。

  • 死锁描述了另外两个线程因为永远等待对方而被阻塞的情况。当死锁发生时,程序永远挂起,你唯一能做的就是杀死程序。 为什么在下面给出的示例生产者-消费者问题中没有发生死锁: 我想知道为什么当同步对象正在等待其他线程释放锁时,在同步块中调用等待方法不会导致死锁?

  • 我不明白为什么这个方法不起作用。它会编译,但会引发运行时错误。

  • 问题内容: 我已经创建了一个MS Access数据库并为其分配了DSN。我想通过我的Java应用程序访问它。 这就是我在做什么: 我在try块的第一行遇到了异常。那是;。为什么会有此异常? 问题答案: 对于Java 7,您可以仅省略该语句,因为它并不是真正需要的。 对于Java 8,您不能使用JDBC-ODBC Bridge,因为它已被删除。您将需要使用类似UCanAccess的名称。有关更多信息

  • 所以我试图构建一个程序,获取一个代表20x20矩阵的整数列表(特别是400个),并找到这个列表中四个垂直连续整数的最大乘积。在这种情况下,索引0、20、40、60处的数字将是垂直连续的数字。不知什么原因,Java控制台正在吐槽如下错误: 线程“main”java.lang.IndexOutoFboundsException:索引418超出长度400的界限,位于java.base/jdk.inter

  • 线程“main”java.lang.indexoutOfboundsException:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64),在java.base/jdk.internal.util.preconditions.outofboundscheckindex(preconditions