Java 邻接列表添加关系
我刚开始使用图形,我正在尝试使用城市建立一个邻接列表。这两个城市被发送到addRelation方法。我想说的是,如果已经没有一个顶点与第一个或最后一个字符串相匹配,那么就用不存在的字符串创建一个新的顶点。现在,我得到的是一个空指针异常,位于带有*的行中。有人对我做错了什么或我应该做什么有什么想法吗Java 邻接列表添加关系,java,graph,nullpointerexception,adjacency-list,Java,Graph,Nullpointerexception,Adjacency List,我刚开始使用图形,我正在尝试使用城市建立一个邻接列表。这两个城市被发送到addRelation方法。我想说的是,如果已经没有一个顶点与第一个或最后一个字符串相匹配,那么就用不存在的字符串创建一个新的顶点。现在,我得到的是一个空指针异常,位于带有*的行中。有人对我做错了什么或我应该做什么有什么想法吗 public class AdjList { public class Node{ int num; Node next; Node(int num, Node next){
public class AdjList {
public class Node{
int num;
Node next;
Node(int num, Node next){
this.num=num;
this.next=next;
}
}
public class Vertex{
String city;
Node list;
Vertex(String city, Node next){
this.city=city;
this.list=next;
}
}
Vertex [] aList= new Vertex [50];
void addRelation(String from, String to) {
for(int i=0; i<aList.length; i++){
****if(!aList[i].city.equals(from)){****
aList[i]=new Vertex(from, null);
}
if(aList[i].city.equals(from)){
aList[i]=new Vertex(from, null);
}
}
}
在您编写的代码行中
Vertex [] aList= new Vertex [50];
这只会为您分配足够的空间,使您可以容纳多达50个顶点项。然而,这并不意味着在分配后数组将立即填充它们。所以你基本上有能力存储50个顶点项目
在您的方法addRelation中,它正在检查!aList[i].city.equalsfrom,但是aList数组没有任何实际的顶点对象,因此当您尝试从aList[i]查询城市字段时,实际上是在尝试查询空对象,因此出现空指针异常
有两种解决方法
按照您在注释中的建议,在继续循环之前检查null
在调用任何方法之前,使用虚拟顶点对象填充数组。
虚拟方法将要求您使用空字符串/构造函数参数的null参数初始化对象,或者您可以实现默认构造函数,只说new Vertex,然后在代码逻辑中自定义Vertex对象的city和next字段。列表数组现在满是null。所以当你访问aList[i]时,它会抛出一个NPE@AlejandroLucena因此,我必须首先检查aList[I]==null?好的,是和否。你可以这样做,或者在调用addRelation之前,循环并用虚拟顶点实例填充数组。另一方面,为什么彼此之间有3个公共类?@AlejandroLucena你不能这样做吗?其中一个选项比另一个更好吗?我想这是实现特定的,并且是一种编码风格偏好。如果内存是个大问题,那么只在需要时添加显然是最佳选择检查循环中是否为null。好的。所以除了检查它是否为null之外。我对邻接矩阵的加法正确吗?那要看情况了。我还没有看到你剩下的代码,或者它的逻辑。为了澄清,你刚才说的是邻接矩阵,但在标题中你说的是邻接列表。我想你想要一张单子?
Vertex [] aList= new Vertex [50];