嘿大家,每当我尝试从节点创建一个简单的边时,我都会收到错误。 基本上,我创建了两个名为Node and 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*)
}
我明白这是一个空指针异常所以在那个循环的某个地方,我一定做错了什么?有谁可以帮我解决一下或给我一些指示?
非常感谢。
答案 0 :(得分:2)
您是否已在neighbours
课程中初始化Node
?看起来异常来自访问空数组(neighbours[i]
)。
看起来neighbours
数组会动态增长/缩小?在这种情况下,不要使用数组,而应考虑使用ArrayList,这样您就不必自己增长neighbours
。
答案 1 :(得分:1)
继@ Alvin的回答(你没有初始化邻居也不允许扩展),试试这个:
public List<Edge> neighbours = new ArrayList<Edge>();
还可以使用java的“foreach”:
for (Edge edge : start.neighbours) {
// .. some code
}
考虑将“邻居”重命名为“边缘”,因为它们只是 - 节点的边缘。
最后,您的逻辑中似乎有一个错误。这似乎太复杂了。您可能试图保留邻居邻居的引用。考虑在需要时简单地查找内容。