【问题标题】:ArrayIndexOutOfBoundsException when initializing a 2dimensional array of objectts初始化二维对象数组时出现 ArrayIndexOutOfBoundsException
【发布时间】:2014-02-18 10:17:11
【问题描述】:

我有一个非常简单的问题,但我不知道为什么会出现这个异常。我正在尝试为数独拼图创建一个二维对象数组,但是当我初始化时,我得到了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();
                }
          }

【问题讨论】:

    标签: java arrays object multidimensional-array


    【解决方案1】:

    在创建数组之前初始化lines。现在创建 0x0 维度的数组,因为 lines 默认为 0。

    lines = 10; // Add this line   
    grid = new Cell[lines][lines];
    

    【讨论】:

    • 我不希望从一开始就固定行值,这就是为什么我有一个按钮的动作侦听器来获得所需的大小。不过还是谢谢你的回答!
    【解决方案2】:

    您应该将网格初始化移到 make grid 方法中,因为在构造函数中,成员 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();
                }
          }
    

    【讨论】:

    • 在你的例子中,行也没有被初始化。
    • @ChristianKullmann 实际上,如果您再看一遍,他会在调用 makeGrid 之前对其进行初始化,但仍应将其移至 makeGrid 方法
    • 这实际上是一个编辑。所以我的评论没有任何意义了:)
    【解决方案3】:

    问题在于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();
              }
         }
     }
    

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

      • 感谢您的回答!我对 C++ 没有这个问题。那么解决方法是把创建数组的构造函数中去掉,添加到方法中?
      • 这是一种解决方案。
      • 你能再推荐一个吗?
      • lines 似乎总是 10,所以你也可以简单地从头开始初始化它:private final int lines = 10;
      猜你喜欢
      • 2021-02-22
      • 2013-09-12
      • 2013-10-04
      • 2020-03-03
      • 2019-12-21
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多