Java 对象为空,但已初始化

Java 对象为空,但已初始化,java,arrays,object,null,Java,Arrays,Object,Null,我有以下代码: public class GameCanvas extends JPanel { private GridField[][] grid; private int x, y; private int fieldSize; public GameCanvas(int rows, int cols, int fieldSize) { this.grid = new GridField[cols][rows]; this.x = cols; this.y =

我有以下代码:

public class GameCanvas extends JPanel {

private GridField[][] grid;
private int x, y;
private int fieldSize;

public GameCanvas(int rows, int cols, int fieldSize)
{
    this.grid = new GridField[cols][rows];
    this.x = cols;
    this.y = rows;
    this.fieldSize = fieldSize;
}

...
}
以下是GridField类的定义:

public class GridField {

private FieldType fieldType;    

public GridField() {
    fieldType = FieldType.EMPTY;
}

public FieldType getFieldType() {
    return fieldType;
}

public void setFieldType(FieldType fieldType) {
    this.fieldType = fieldType;
    }
}
问题是,当我试图访问“网格”对象时,编译器说它为null,尽管我已经在类的构造函数中初始化了它

我做了一个小检查:

if(grid[xSize][ySize] == null) {
  System.out.println("Grid[x][y] is null");
}
它打印出的正是我所期望的-空

我是从C语言背景来到Java的,所以我可能错过了一些东西。我相信,这是个小错误,但我找不到

提前谢谢你的提示

this.grid = new GridField[cols][rows];
以上代码仅初始化数组。您还需要使用
GridField
对象初始化每个数组元素

可能是这样的:-

for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
        grid[i][j] = new GridField();
    }
}
for(int i=0;i
我是从C语言背景来到Java的,所以我可能错过了 什么

这种初始化方式在
C.
中没有什么不同。因此,如果您在
C
中初始化了这样的数组,那么您可能也遗漏了一些内容。注意@JonSkeet的评论

this.grid = new GridField[cols][rows]; 
这仅初始化数组,但没有元素


数组中的元素指向null

,请注意,这在Java和C#之间没有区别-OP在C#中会看到完全相同的行为。谢谢!我以为这只是个琐事。我只是循环遍历数组的每个元素,并用新的GridField初始化它,它就工作了。非常感谢。如下所示:
grid[0][0]=new-GridField(),另外,如果可以增量填充的话,你可以使用嵌套的
循环来填充它。@Jon Skeet-我认为这不是Java的问题,只是我缺乏知识。@jam40jeff。。顺便说一下,Java中没有
struct
这样的东西,数组中的元素是空的。真的没有空对象这种东西。@null。。请注意,数组中的元素是引用,它们不能为null。事实上,您应该说,数组中的元素指向null。