Java 在图形中创建节点会导致nullpointer异常

Java 在图形中创建节点会导致nullpointer异常,java,graph,Java,Graph,# 我是java的初学者,我正在尝试实现一个图形数据结构。我可能做了一个奇怪的实现,但我认为它应该可以工作,我不确定Graph类中createNode方法中为什么会出现错误。我认为某个对象有一个空引用,但我不知道如何处理我的错误。我认为我的代码的其余部分可以工作,但我不能确定,因为我无法测试它超过这一点。我的代码可以编译,但当我尝试从Graph类中创建节点时,会得到一个NullPointerError。我试过很多东西,但都不管用。以前,我尝试在创建对象时动态命名对象,但显然Java不支持该功能,

# 我是java的初学者,我正在尝试实现一个图形数据结构。我可能做了一个奇怪的实现,但我认为它应该可以工作,我不确定Graph类中createNode方法中为什么会出现错误。我认为某个对象有一个空引用,但我不知道如何处理我的错误。我认为我的代码的其余部分可以工作,但我不能确定,因为我无法测试它超过这一点。我的代码可以编译,但当我尝试从Graph类中创建节点时,会得到一个NullPointerError。我试过很多东西,但都不管用。以前,我尝试在创建对象时动态命名对象,但显然Java不支持该功能,因此我尝试实例化对象并将其与字符串键值一起存储在HashMap中

我的主课

public class GraphTraversal{

    public static void main(String [] args)
        {
            Graph marvelUniverse = new Graph();
            marvelUniverse.createNode("Princess Leia");
            marvelUniverse.createNode("Luke Skywalker");
            marvelUniverse.nodeJoin("Princess Leia", "Luke Skywalker", "A beautiful friendship");
            System.out.println(marvelUniverse.isAdjacent("Princess Leia", "Luke Skywalker"));
        }
}
我的节点类

import java.util.HashMap;
public class Node
{
    protected String name;
    private HashMap<String,String> references;

    public Node(String character){
        this.name = character;
        this.references = new HashMap<String,String>();
        //HashMap<String, String> references = new HashMap<String, String>();
    }

    public void addRef(Node node, String edge){
        if (refExists(node)){
            if ((references.get(node.name)).compareTo(edge) >= 0){
            references.put(node.name, edge);
            }
            else 
                return;
        }
        else{
            references.put(node.name, edge);
            return;
        }
    }

    public boolean refExists(Node nodeName){
        if (references.get(nodeName.name) != null){
            return true;
        }
        return false;
    }
}
import java.util.HashMap;
公共类节点
{
受保护的字符串名称;
私有HashMap引用;
公共节点(字符串){
this.name=字符;
this.references=newhashmap();
//HashMap references=新的HashMap();
}
公共void addRef(节点、字符串边缘){
如果(refExists(node)){
if((references.get(node.name)).compareTo(edge)>=0){
references.put(node.name,edge);
}
其他的
返回;
}
否则{
references.put(node.name,edge);
返回;
}
}
公共布尔值refExists(节点nodeName){
if(references.get(nodeName.name)!=null){
返回true;
}
返回false;
}
}
我的图形课

import java.util.HashMap;
import java.util.ArrayList;

public class Graph
    {

    private HashMap<String, Node> nodeList;
    private ArrayList<String> objNames;
    public int count=0;

    public Graph(){
        HashMap<String, Node> nodeList = new HashMap<String, Node>();
        // List<String[]> objNames = new ArrayList<String[]>();
        // for (int i=0;i<10000;i++){
        //  objNames.add(("objectnames"+i));
        }

    public void createNode(String nodeName){
        //if (this.nodeExists(nodeName)==false){
            Node someObject;
            someObject = new Node(nodeName);
            nodeList.put(nodeName, someObject);
        //  }
    }

    public boolean isAdjacent(String firstNode, String secondNode){
        if ((nodeList.get(firstNode)).refExists(nodeList.get(secondNode))){
            return true;
        }
        return false;
    }   

    public void nodeJoin(String firstNode, String secondNode, String edge){
        if (isAdjacent(firstNode, secondNode) != true){
            (nodeList.get(firstNode)).addRef((nodeList.get(secondNode)),edge);
            (nodeList.get(secondNode)).addRef((nodeList.get(firstNode)),edge);
        }
        return;
    }

/*  public void listRefs(String someNode){
        (nodeList.get(someNode)).retRefs();
    } */

    public boolean nodeExists(String nodeName){
        // if(nodeList.get(nodeName)!=null){
        //  return true;
        // }
        return false;
    }

    //public void stringToGraph()
}
import java.util.HashMap;
导入java.util.ArrayList;
公共类图
{
私有HashMap节点列表;
私人ArrayList objNames;
公共整数计数=0;
公共图(){
HashMap nodeList=新的HashMap();
//List objNames=new ArrayList();

//对于(int i=0;i当您仔细查看它时,您只在以下任何位置声明了NodeList未初始化它:

private HashMap<String, Node> nodeList;
私有HashMap节点列表;
你需要让它像

private HashMap<String, Node> nodeList = new HashMap();
private HashMap nodeList=new HashMap();
或者,您可以在构造函数中更改局部变量,并更新Graph对象的nodeList变量:

public Graph(){
    this.nodeList = new HashMap<String, Node>();
}
公共图(){
this.nodeList=newhashmap();
}

对不起,我对编程很陌生,堆栈跟踪是什么?你的意思是:线程“main”java.lang.NullPointerException在Graph.createNode(Graph.java:24)在GraphTraversal.main(GraphTraversal.java:6)中的异常如果您使用的是任何现代Java IDE,则可以在调试模式下运行。在调试模式下,Eclipse在遇到未处理的异常时将自动中断,这将让您查看变量以查看空值。此外,发布堆栈跟踪也会有所帮助。堆栈跟踪包含在错误消息中,告诉您存在异常(可能只是将所有输出粘贴到命令行上)。您将看到一个完整的行,告诉您nullpointerException的确切位置。如果您使用的是IDE,例如eclipse,那么您可以轻松地从那里复制并粘贴here@user3010969:没错,我只使用了一个文本编辑器和命令行编译。但是当我使用eclipse时,我想它说某个对象持有一个空引用。Thanks太多了!它现在可以工作了,但是你能解释一下你列出的解决方案和我所做的有什么区别吗?我是否在构造函数中创建了一个与私有HashMap节点列表分开的局部变量;我在上面声明了?是的,你在构造函数中创建并初始化了一个局部变量。但是在createNode方法中你在尝试使用仅声明为未初始化的类变量nodeList之前,建议您在IDE中使用,例如Eclipse或Netbeans。这将在学习时提供很大的优势如果您有兴趣了解此解决方案修复它的确切原因,请阅读java中的作用域。无论是否使用IDE,了解它们都是至关重要的。一个快速搜索找到了这个让你开始