访问二维数组中对象的方法时出现NullPointerException

时间:2012-04-03 12:57:43

标签: java multidimensional-array

我正在尝试创建一个“Node”对象的二维数组,如下所示

    public static void main(String[] args) throws IOException {
            length=getNumber("Enter the length of the field: ");
            breadth=getNumber("Enter the breadth of the filed: ");
            node n = new node();
            node [][] field = new node[length][breadth];
            for(i=0;i<=length;i++){
                for(j=0;j<=breadth;j++){
                    F =getNumber("Enter the F value");
                    field[i][j].setF(F);
                    System.out.println("  "+field[i][j].getF(F);
                }
            }

    }

在上面的代码中getNumber是一个函数,其中我打印并接受该数字 这是我的节点类:

public class node {
public int F;
public int G;
public int H;
public boolean isVisited;
public boolean isCurrent;
public void node(int F,int G,int H,boolean isVisited, boolean isCurrent){
    this.F=F;
    this.G=G;
    this.H=H;
    this.isVisited=isVisited;
    this.isCurrent=isCurrent;

}
public int getF() {
    return G+H;
}
public void setF(int f) {
    F = f;
}
public int getG() {
    return G;
}
public void setG(int g) {
    G = g;
}
public int getH() {
    return H;
}
public void setH(int h) {
    H = h;
}
public boolean isVisited() {
    return isVisited;
}
public void setVisited(boolean isVisited) {
    this.isVisited = isVisited;
}
public boolean isCurrent() {
    return isCurrent;
}
public void setCurrent(boolean isCurrent) {
    this.isCurrent = isCurrent;
}

}

我想要做的就是,在每个节点对象中存储/访问F,G,H等的各种值,然而问题是我java.lang.NullPointerException field[i][j].setF(F); 我不知道我哪里出错了,需要一些帮助。

2 个答案:

答案 0 :(得分:2)

您初始化了数组,但没有填充它。

考虑这一行:

field[i][j].setF(F);

当你这样做时

field[i][j]

您正在访问该阵列;即在该位置获取阵列中的内容。由于您没有在数组中放置任何内容,因此您将获得null。但是你立刻试着打电话给setF

我注意到你做了

node n = new node();

在循环之外。你可能想在循环中这样做。

node n = new node();
n.setF(F);
field[i][j] = n;

此代码创建一个node实例,在其上设置一个值,然后将其放在指定位置的数组中。更奇特的方法是做一些像

这样的事情
node n = field[i][j];
if (n == null) { // initialize n at the position if it doesn't exist
  n = new node();
  field[i][j] = n;
}

field[i][j].setF(f);

或者,您可以在初始化数组后立即遍历数组并在每个位置放置一个新的node

最后,在Java标准实践中,用大写字母开始类名。 node应为Node

答案 1 :(得分:0)

试试这个:

for(i=0;i<=length;i++){
    for(j=0;j<=breadth;j++){
        F =getNumber("Enter the F value");

        node tmp = new node();
        tmp.setF(F);

        field[i][j] = tmp;
        System.out.println("  "+field[i][j].getF(F);
    }
}

PS中的PS它是类名以大写字母开头的惯例,应该用CamelCase编写

[编辑] 请注意你的get / setF()函数,因为它们不对相同的变量进行操作

与您的问题无关,但您可能希望通读此document这将教您如何在java中命名约定并帮助您编写更易于阅读的代码