【问题标题】:NullPointerException adding data to BSTNullPointerException 向 BST 添加数据
【发布时间】:2017-05-11 18:33:49
【问题描述】:

我正在实现一个具有 3 个类的 BST: BSTBSTNodeProfile

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 添加一个条目时,它似乎工作正常,但是当我向 BST 添加两个或更多条目时,它给了我这个错误:

Exception in thread "main" java.lang.NullPointerException
    at BST.insertProfile(BST.java:21)
    at BSTMain.main(BSTMain.java:19)

我已经尝试解决这个问题好几个小时了,如果有人能暗示我哪里出错了,将不胜感激。

【问题讨论】:

标签: java eclipse tree binary-search-tree


【解决方案1】:

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

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

您正在做的是声明parentnull,然后在其上调用一个方法(getProfile),这就是导致NullPointerException 的原因。你必须先实例化parent

【讨论】:

  • 非常感谢!如果我也改变: BSTNode parent = new BSTNode(p);它会工作吗?
  • 您必须进行更多更改才能使您的代码正常工作;例如,while 循环中的 else 语句放错了位置(它应该在第一个 if 语句之后,而是在第二个之后)。此外,您还希望将评估 compare 的语句移动到 while 循环内,以便循环可以终止。对我有帮助的是(物理上)画出流程的每个步骤并查看我将如何编码;这样,您可能会看到 while 循环中出现的其他几个错误。
【解决方案2】:

正确插入 BST 以平衡节点并围绕空指针。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多