NullPointerException при доступе к методу в объекте в 2-мерном массиве - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь создать двумерный массив объектов "Узел" следующим образом

    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 ]

2 голосов
/ 03 апреля 2012

Вы инициализировали массив, но не заполнили его.

Рассмотрим эту строку:

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

Когда вы делаете

field[i][j]

вы обращаетесь к массиву; т.е. получить то, что находится в массиве в этой позиции. Поскольку вы ничего не поместили в массив, вы получите ноль. Но вы сразу же попытаетесь позвонить 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.

0 голосов
/ 03 апреля 2012

Попробуйте это:

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 В Java для имен классов принято начинать с заглавной буквы, и их следует записывать в CamelCase

[править] Будьте осторожны с вашими функциями get / setF (), так как они не работают с одинаковыми переменными

не относится к вашему вопросу, но вы можете прочитать этот документ , который научит вас соглашениям об именах в java и поможет вам написать код, который легче читать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...