HashMap中的Java空链接列表
我很难弄清楚为什么某个HashMap中的Java空链接列表,java,null,linked-list,hashmap,Java,Null,Linked List,Hashmap,我很难弄清楚为什么某个LinkedList是null,因此我得到了NullPointerException。以下是我的程序崩溃前的输出: adjList: {vertex: A, rep: A=[vertex: C, rep: C, 6, vertex: B, rep: B, 13], vertex: F, rep: F=[vertex: D, rep: D, 3, vertex: E, rep: E, 2], vertex: B, rep: B=[vertex: A, rep: A, 13,
LinkedList
是null
,因此我得到了NullPointerException。
以下是我的程序崩溃前的输出:
adjList: {vertex: A, rep: A=[vertex: C, rep: C, 6, vertex: B, rep: B, 13], vertex: F, rep: F=[vertex: D, rep: D, 3, vertex: E, rep: E, 2], vertex: B, rep: B=[vertex: A, rep: A, 13, vertex: C, rep: C, 7, vertex: D, rep: D, 1], vertex: D, rep: D=[vertex: B, rep: B, 1, vertex: C, rep: C, 14, vertex: E, rep: E, 9, vertex: F, rep: F, 3], vertex: C, rep: C=[vertex: A, rep: A, 6, vertex: B, rep: B, 7, vertex: D, rep: D, 14, vertex: E, rep: E, 8], vertex: E, rep: E=[vertex: C, rep: C, 8, vertex: D, rep: D, 9, vertex: F, rep: F, 2]}
ufList: {vertex: A, rep: A=[vertex: A, rep: A], vertex: F, rep: F=[vertex: F, rep: F], vertex: B, rep: B=[vertex: B, rep: B], vertex: D, rep: D=[vertex: D, rep: D], vertex: C, rep: C=[vertex: C, rep: C], vertex: E, rep: E=[vertex: E, rep: E]}
true
v: vertex: A, rep: A
null
Exception in thread "main" java.lang.NullPointerException
adjList
是一个HashMap
,其键是用户定义的类型UFnode
,值是对的LinkedList
。
下面是我对Pair.java的代码:
public class Pair<F, S>
{
public F first;
public S second;
public Pair(F key, S value)
{
this.first = key;
this.second = value;
}
public Pair(Pair<F, S> p)
{
this.first = p.first;
this.second = p.second;
}
@Override
public String toString()
{
return String.format("%s, %s", this.first, this.second);
}
}
这里是main:
public static void main(String[] args)
{
bar b = new bar(); //bar will print out adjList and ufList after construction
b.foo(); //I get my error here
}
这是栏的构造函数:
public bar()
{
adjList = initAdjListDefault();
ufList = initUfListDefault();
System.out.printf("adjList: %s\n", adjList.toString());
System.out.printf("ufList: %s\n", ufList.toString());
}
以下是adjList
和ufList:
public HashMap<UFnode, LinkedList<Pair<UFnode, Integer>>> adjList;
public HashMap<UFnode, LinkedList<UFnode>> ufList;
最后一条语句:System.out.println(adjList.get(v))
printsnull,
,我不知道为什么。从输出中,我们可以看到v
被初始化为vertex:A,rep:A,
我们还可以看到这是adjList中的一个键。
为什么不返回与此键关联的值?
谢谢你的帮助 获取NPE是因为
adjList.get(v)
返回null
,这意味着它无法找到v在列表中保存的UFnode
。为什么要创建一个新的UFnode,而不是使用it.next()
返回的UFnode?查看迭代器是如何创建的会很有帮助。我添加了Iterator
定义。我明白为什么我得到了NPE,但是我不知道adjList.get(v)
是如何返回null的。
如果你看adjList
的打印,你会看到v。
你必须在IDE调试器(Eclipse、NetBeans、IntelliJ等)中一步一步地检查这段代码,看看当你得到NPE时变量值是什么。没有更好的调试方法了。我打印了adjList
的值,得到了null。
我还能做什么?调试是否允许我单步执行HashMap
代码?在顶部显示adjList和ufList的内容。您的迭代器正在从ufList中获取内容。调用adjList.get(v)
要求HashMap在adjList中找到一个与v
键相同的条目。但是v是v:vertex:A,rep:A,虽然adjList中有一个带有vertex:A和rep:A的条目,但adjList中的“rep:A”与ufList中的“rep:A”不同。这些代表包含不同的链接列表,因此它们不匹配。要使它们匹配,键必须相同。也许您应该使用字符串作为adjList HashMap中的键,并使用UFnode.getVertex()
值。
public HashMap<UFnode, LinkedList<Pair<UFnode, Integer>>> adjList;
public HashMap<UFnode, LinkedList<UFnode>> ufList;
Iterator it = ufList.get(u).iterator();
while(it.hasNext()) //for each vertex in component C
{
UFnode v = new UFnode((UFnode)it.next());
if( instanceof UFnode)
{System.out.println("true");}
System.out.printf("v: %s\n", v.toString());
System.out.println(adjList.get(v)); //adjList.get(v) prints `null`
...