Создание ребра из узла в Java - PullRequest
1 голос
/ 31 мая 2011

Привет всем, я получаю сообщение об ошибке всякий раз, когда пытаюсь создать простое ребро из узла.По сути, я создал два моих собственных класса с именами Node и Edge.

Класс Node выглядит следующим образом:

public class Node {

    public String ident;
    public int numLinks;

    public Edge[] neighbours;


    public Node (String ident) {
        this.ident = ident;

    }

    public void setNeighbour (Node start, Node end, int cost, int portNum) {

    }
}

И мой класс Edge выглядит следующим образом:

public class Edge {

   Node start;
   Node end;
   int cost;
   int portNum;

   public Edge (Node a, Node b, int cost, int portNum) {
       this.start = a;
       this.end = b;
       this.cost = cost;
       this.portNum = portNum;
   }
}

В моем основном классе я создаю два узла, а именно, начальный и конечный узлы.Стоимость и номер порта (номер порта, на котором слушают оба эти узла), я читаю из текстового файла и сохраняю их в список массивов с именами "linkCostList" и "portNumList".

Теперь, так каккаждый начальный узел может иметь более одного ребра (я в основном создаю граф), я вызываю метод setNeighbour () следующим образом,

for (int i = 0; i < startNode.numLinks; i++) {
    nextNode = new Node (String name of node I read from text file)
    startNode.setNeighbour (startNode, nextNode, linkCostList.get(i), portNumList.get(i));
}

Мой метод setNeighbour выглядит следующим образом;

public void setNeighbour (Node start, Node end, int cost, int portNum) {
    for (int i = 0; i < start.numLinks; i++) {
        neighbours[i] = new Edge (start, end, cost, portNum);
    }
}

Всякий раз, когда я его компилирую, я получаю ошибку следующего вида:

Exception in thread "main" java.lang.NullPointerException
    at Node.setNeighbour(Node.java: *line number*)
    at Start.startlsr(Start.java: *line number*)
    at graph.main(lsr.java: *line number*)
}

Я понимаю, что это исключение нулевого указателя, поэтому где-то в этом цикле я должен делатьчто-то не так?Может ли кто-нибудь помочь мне разобраться или дать несколько советов?

Очень ценится.

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Вы инициализировали neighbours в вашем Node классе? Похоже, исключение составляет доступ к нулевому массиву (neighbours[i]).

Также похоже, что массив neighbours будет динамически увеличиваться / уменьшаться? В этом случае вместо использования массива рассмотрите возможность использования ArrayList, чтобы вам не приходилось увеличивать neighbours самостоятельно.

1 голос
/ 31 мая 2011

В дополнение к ответу @ Элвина (вы не инициализировали соседей и не допустили расширения), попробуйте следующее:

public List<Edge> neighbours = new ArrayList<Edge>();

Также используйте java "foreach":

    for (Edge edge : start.neighbours) {
        // .. some code
    } 

Подумайте о переименовании «соседей» в «ребра», так как они просто - ребра узла.

Наконец, кажется, у вас есть ошибка в вашей логике. Это кажется слишком сложным. Возможно, вы пытаетесь сохранить ссылки на соседей соседей. Подумайте, просто искать вещи, когда вам это нужно.

...