2

每当我尝试从节点创建简单边时都会出现错误。基本上,我创建了两个我自己的类,称为 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*)
}

我知道这是一个空指针异常,所以,在那个循环的某个地方,我一定做错了什么。有人可以帮我弄清楚吗?

4

2 回答 2

3

neighboursNode课堂上初始化了吗?看起来异常来自访问空数组(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 回答