初始化2维对象数组时的ArrayIndexOutOfBoundsException

时间:2014-01-27 14:17:53

标签: java arrays object multidimensional-array

我有一个非常简单的问题,但我无法弄清楚为什么我有这个例外。我正在尝试为数独谜题创建一个二维数组对象,但是当我初始化时,我正在获得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();
                }
          }

4 个答案:

答案 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];