使用PriorityQueue的NullPointerException

时间:2014-12-28 09:35:33

标签: java collections graph

我创建一个简单的相邻List,其中每个节点都是String类型
图的实现是:

HashMap<String,HashSet<String>> //From every node to a Set of nodes...

但是在BFS实现中我得到了NullPointerException
我正在玩它,但我不明白真正的问题

import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) {
        HashMap<String,HashSet<String>> m=new HashMap();
        HashSet<String> h_s = new HashSet();
        //Now fill in the h_s
        h_s.add("B");
        h_s.add("C");
        h_s.add("D");
        //Path from A --- to --> B,C,D
        m.put("A",h_s);
        // Now let`s make a BFS
        Queue<String> q=new PriorityQueue();
        //starting from A
        q.add("A");
        String current_vertex;
        while (!q.isEmpty()) {
            current_vertex = q.remove();
            //For every vertex adjacent with current_vertex
            for (String vertex_to:m.get(current_vertex)) {
                System.out.println("BFS is checking "+vertex_to);
                q.add(vertex_to);//This line causing NullPointerException
            }
        }
    }

但是,如果我们删除行

q.add(vertex_to)

一切都很好 这让我更加困惑。

请详细解释,因为我认为我错过了重要的 提前致谢

1 个答案:

答案 0 :(得分:1)

您的地图只有&#34; A&#34;键,所以当你添加&#34; B&#34;,&#34; C&#34;和&#34; D&#34;到队列,然后将其从队列中删除,m.get(current_vertex)返回null。

您必须检查密钥是否在地图中:

    while (!q.isEmpty()) {
        current_vertex = q.remove();
        //For every vertex adjacent with current_vertex
        if (m.containsKey(current_vertex) {
            for (String vertex_to:m.get(current_vertex)) {
                System.out.println("BFS is checking "+vertex_to);
                q.add(vertex_to);//This line causing NullPointerException
            }
        }
    }