我有一个非常简单的问题,但我无法弄清楚为什么我有这个例外。我正在尝试为数独谜题创建一个二维数组对象,但是当我初始化时,我正在获得ArrayIndexOutOfBoundsException
。请帮助,我已经阅读了类似的问题,它应该有效!
这里我正在声明网格(使用的二维对象数组和构造函数):
public class Sudoku extends javax.swing.JFrame {
private int lines;
Cell[][] grid;
public Sudoku() {
initComponents();
grid = new Cell[lines][lines];
所以,当我按下一个按钮来设置线条(尺寸长度),如下所示
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
lines=10;
makeGrid(lines);
}
我得到了例外:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at Sudoku.makeGrid(Sudoku.java:146)
public void makeGrid(int size) {
for(int i=0;i<size;i++)
for(int j=0;j<size;j++) {
146: grid[i][j] = new Cell();
}
}
答案 0 :(得分:2)
您应该将网格初始化移动到make网格方法,因为在构造函数中,成员lines
仍未使用您所需的值进行初始化(默认值int为0,因此您获得一个空数组,并尝试之后使用更大的未分配边界访问它)
public void makeGrid(int size) {
this.lines = size; // If you do not need lines anywhere else then it is redundant
grid = new Cell[size][size];
for(int i=0;i<size;i++)
for(int j=0;j<size;j++) {
grid[i][j] = new Cell();
}
}
答案 1 :(得分:1)
问题是int
的默认值为0.
因此,当您创建Sudoku
对象时,grid = new Cell[lines][lines];
相当于grid = new Cell[0][0];
更改makeGrid
方法或在构造函数中提供大小。
public void makeGrid(int size) {
this.lines = size;
grid = new Cell[size][size];
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
grid[i][j] = new Cell();
}
}
}
答案 2 :(得分:0)
grid = new Cell[lines][lines];
创建一个大小为[0][0]
的数组,因为lines
在运行该语句时仍为0
。
稍后您对lines
所做的更改将不会影响数组大小,该大小将保持[0][0]
...
更简单的例子:
int size = 0;
Object[] array = new Object[size];
size = 1;
System.out.println(array.length); //prints 0, not 1
答案 3 :(得分:0)
在创建数组之前初始化lines
。现在您创建具有0x0维度的数组,因为lines
为0是默认值。
lines = 10; // Add this line
grid = new Cell[lines][lines];