添加字符串时,二叉搜索树中的恶意空指针

时间:2015-04-19 23:23:46

标签: java nullpointerexception

从事家庭作业,这里是代码:

public void insert(E value){
        Node addative= new Node(value, null, null);
        Node current=this.root;
        if(current==null){
            this.root = addative;
            size++;
            return;
        }
        System.out.println("root is: "+root.value+" value is: "+value);
        while(true){
            //System.out.println("current is currently: "+current.value);
            if(null==current.lesser)System.out.println("lesser is null");
            else System.out.println("lesser is: "+current.lesser.value);
            if(null==current.greater)System.out.println("greater is null");
            else System.out.println("greater is: "+current.greater.value);

            //if slot is empty and addative belongs here
            if(current.lesser==null&&current.value.compareTo(addative.value)>0){
                System.out.println("was added lesser");
                current.lesser=addative;
                break;
            }

            //if slot is empty and addative belongs here
            if(current.greater==null&&current.value.compareTo(addative.value)<=0){
                System.out.println("was added greater");
                current.greater=addative;
                break;
            }
            System.out.println("here");

            //no valid empty slots ergo continue along tree
            if(current.value.compareTo(addative.value)>0)current=current.lesser;
            if(current.value.compareTo(addative.value)<=0)current=current.greater;
        }
        size++;
        System.out.println("next word");
    }

这是打印输出:

  

root是:橘子的价值是:怀疑论者   较小的是空的   greater为null   添加较少   下一个字   root是:橘子的价值是:袋熊   较小的是:怀疑论者   greater为null   增加了更多   下一个字   root是:tangerines值是:valeting   较小的是:怀疑论者   更大的是:袋熊   这里   较小的是空的   greater为null   添加较少   下一个字   root是:橘子的价值是:泡沫   较小的是:怀疑论者   更大的是:袋熊   这里   较小的是空的   greater为null   添加较少   下一个字   根是:橘子的价值是:鸽子   较小的是:怀疑论者   更大的是:袋熊   这里   较小的是:泡沫   greater为null   这里

Exception in thread "main" java.lang.NullPointerException
    at BinarySearchTree.insert(BinarySearchTree.java:35)
    at BinarySearchTree.main(BinarySearchTree.java:178)

第35行说:

if(null==current.lesser)System.out.println("lesser is null");

我是否尝试将null引用错误?我不明白这可以增加5-10个单词并且可以正常工作,但是在第11次它出错了。

1 个答案:

答案 0 :(得分:0)

您要将null分配给您当前的地址:

// before adding 'pigeonhole':
             tangerines
    skeptics           wombats
bubble     null    valeting   null

现在,在'怀疑论者',"skeptics".compareTo("pigeonhole") < 0时,您设置current = current.greater,即current = null。在下一次迭代中,您调用current.lesser,这会产生NPE。

这里的问题是你自己说'没有有效的空位'并在那之后立即分配它们。您应该更改逻辑,以便在未在当前级别执行插入时,current分配不仅基于compareTo结果,还基于条目“null状态为好。 E.g:

// pigeonhole < skeptics, hence
if (current > addative && current.lesser != null) {
    current = current.lesser;
}
// and something like that for the 'greater' case

无论如何,你应该使用旧的铅笔纸调试,因为如果你试图手动重现这些步骤,很容易发现这个bug。实际上,你应该在之前使用这个方法开始编写算法代码,因为看起来对你的实现的正确性的正式评估不是你最强的一面,并写下你的程序的每一个可能的步骤是培养这种技能的最佳方式。