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))
prints
null,
,我不知道为什么。从输出中,我们可以看到
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`
    ...