2

ノードから単純なエッジを作成しようとすると、エラーが発生します。基本的に、Node と Edge という 2 つの独自のクラスを作成しました。

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;
   }
}

私のメイン クラスでは、開始ノードと終了ノードという 2 つのノードを作成します。コストとポート番号 (両方のノードがリッスンするポート番号) をテキスト ファイルから読み取り、"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*)
}

これは null ポインターの例外であることは理解しています。そのため、そのループのどこかで、何か間違ったことをしているに違いありません。誰でも私がそれを理解するのを手伝ってもらえますか?

4

2 に答える 2

3

クラスで初期化neighboursしましたNodeか?null 配列 ( neighbours[i]) へのアクセスによる例外のようです。

また、neighbours配列が動的に拡大/縮小するように見えますか? この場合、配列を使用する代わりに、ArrayList を使用することを検討してください。これにより、自分で拡張する必要がなくなりneighboursます。

于 2011-05-31T01:40:44.930 に答える
1

@Alvinの回答(ネイバーを初期化していないか、拡張を許可していない)に加えて、これを試してください:

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

また、Java の「foreach」も利用します。

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

「隣人」の名前を「エッジ」に変更することを検討してください。それらはまさにノードのエッジであるためです。

最後に、ロジックにバグがあるようです。複雑すぎるようです。隣人の隣人の参照を保持しようとしている可能性があります。必要なときに簡単に検索することを検討してください。

于 2011-05-31T01:54:47.743 に答える