Java 向BST添加数据的NullPointerException

Java 向BST添加数据的NullPointerException,java,eclipse,tree,binary-search-tree,Java,Eclipse,Tree,Binary Search Tree,我正在实现一个BST,它有3个类: BST、BSTNode和配置文件 BST课程 public class BST { private static BSTNode root; private BSTNode parent; BST() { root = null; } public void insertProfile(Profile p) { BSTNode newNode = new BSTNode(p);

我正在实现一个BST,它有3个类: BSTBSTNode配置文件

BST课程

public class BST {

    private static BSTNode root;
    private BSTNode parent;

    BST() {
        root = null;
    }

    public void insertProfile(Profile p) {

        BSTNode newNode = new BSTNode(p);

        if (root == null) {
            root = newNode;
        } else {
            BSTNode focusNode = root;

            BSTNode parent = null;
            int compare = focusNode.getProfile().getName().compareTo(parent.getProfile().getName());
            while (true) {
                parent = focusNode;
                if (compare < 0) {
                    focusNode = focusNode.left;
                    if (focusNode == null) {
                        parent.left = newNode;
                        return;
                    } else {
                        focusNode = focusNode.right;
                        if (focusNode == null) {
                            parent.right = newNode;
                            return;
                        }
                    }
                }
            }
        }

    }


}
我已经尝试解决这个问题好几个小时了,如果有人能提示我哪里出了问题,我将非常感激。

这是因为这段代码(在
BST.java
中,就在
insertProfile
中的
else
语句之后):

BSTNode parent = null;
int compare = focusNode.getProfile().getName().compareTo(parent.getProfile().getName());

您所做的是声明
父级
,然后对其调用一个方法(
getProfile
),这就是导致
NullPointerException的原因。您必须先实例化
父级

正确插入BST以平衡节点并环绕NullPointer

public static Node insert(Node root,int data) {

    if(root == null){
        Node node = new Node(data);
        root = node;
    }else if (data > root.data) {
        root.right = insert(root.right , data);
    }else if (data < root.data){
        root.left = insert(root.left , data);
    }

    return root;
}
公共静态节点插入(节点根,int数据){
if(root==null){
节点=新节点(数据);
根=节点;
}else if(数据>根数据){
root.right=插入(root.right,数据);
}else if(数据<根数据){
root.left=插入(root.left,数据);
}
返回根;
}

非常感谢!如果我也更改:BSTNode parent=new BSTNode(p);它会工作吗?您必须进行更多更改才能使代码工作;例如,
while
循环中的
else
语句放错了位置(它应该在第一个
if
语句之后,但应该在第二个语句之后)。此外,您希望将求值
compare
的语句也移动到
while
循环中,以便循环可以终止。对我有帮助的是(物理上)画出流程的每一步,看看我将如何编写代码;您可能会看到
中出现的其他几个错误,而
则以这种方式循环。
public static Node insert(Node root,int data) {

    if(root == null){
        Node node = new Node(data);
        root = node;
    }else if (data > root.data) {
        root.right = insert(root.right , data);
    }else if (data < root.data){
        root.left = insert(root.left , data);
    }

    return root;
}