0

这是二叉树类的一部分,这里是 find 函数,给出在树中查找节点的键,如果没有找到返回null,但是这部分已被识别为死代码,当我将if(current==null)语句移动到底部时内while循环,它的工作原理,为什么?是一样的吗?

public class Tree {
    public Node root;

    public Node find(int key) {
        Node current = root;
        while (current.key != key) {
            if (current == null) { //dead code here, why?
                return null;
            }

            if (key < current.key) {
                current = current.leftChild;
            } else if (key > current.key) {
                current = current.rightChild;
            }
        }
        return current;
    }
}

public class Node {
    public char label;
    public boolean visited = false;
    public int key;
    public float data;

    public Node leftChild;
    public Node rightChild;

}
4

5 回答 5

1

因为

while (current.key != key) // <-- current.key would throw NPE if current was null.
于 2013-12-31T05:20:00.547 回答
1

如果currentnull,它永远不会在您current.key事先访问时到达空检查,它会抛出一个nullPointerException 如果您if(current==null)在分配新值之前将它移到底部,那么它就不会是死代码。(作为 current.leftChild 并且current.rightChild可能是null

于 2013-12-31T05:20:11.320 回答
1

在之前的声明中,您取消引用current.key. 如果current == null,您将拥有一个 NPE。如果不是 null,那么if检查是没有意义的,因为它永远不会到达。

您可能打算做的是将if检查移到循环之前:

public Node find(int key) {
    if (root == null) { 
        return null;
    }
    Node current = root;
    while (current.key != key) {
        if (key < current.key) {
            current = current.leftChild;
        } else if (key > current.key) {
            current = current.rightChild;
        }
    }
    return current;
}

这将为您提供所需的预期行为。

于 2013-12-31T05:20:43.593 回答
0
while (current.key != key) {
        if (current == null) { //dead code here, why?
            return null;
        }

在您的 while 条件下,您已经确保 current 不为空(通过使用 current.key!=key),因此在 if(current==null) 中重新检查它是没有意义的。如果 current=null,那么您将在 while() 中获得 NullPointerException,您甚至不会达到 if 条件。

于 2013-12-31T05:20:29.580 回答
0

如果 current.key 尚未通过尝试访问 key 成员引发 NullPointerException,则 current 在 while 循环开始时不可能为 null。当测试移到循环底部时,current 已被分配一个新值,编译器将其识别为可能为 null。

于 2013-12-31T05:24:37.087 回答