Java Dead Code, может кто-нибудь объяснить?

Это часть класса двоичного дерева, вот функция поиска, учитывая ключ для поиска узла в дереве, если он не найден, возвращает 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;

}

person albert    schedule 31.12.2013    source источник
comment
Что такое root? Где вы это определили?   -  person Vimal Bera    schedule 31.12.2013
comment
вы никогда не определяли root, поэтому current ВСЕГДА имеет значение null...   -  person Marc B    schedule 31.12.2013
comment
@MarcB в вашем случае выдает ошибку. Я думаю, что Альберт инициализировал root.   -  person Vimal Bera    schedule 31.12.2013
comment
извините, обновил весь код, рут определился.   -  person albert    schedule 31.12.2013


Ответы (5)


Если current равен null, он никогда не дойдет до нулевой проверки, поскольку вы обращаетесь к current.key заранее, он выдаст nullPointerException. Если вы переместите if(current==null) вниз, поскольку вы назначаете новое значение, прежде чем это не будет мертвым кодом. (так как current.leftChild и current.rightChild могут быть null)

person Thudani Hettimulla    schedule 31.12.2013

Потому что

while (current.key != key) // <-- current.key would throw NPE if current was null.
person Elliott Frisch    schedule 31.12.2013

В предыдущем заявлении вы разыменовываете 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;
}

Это даст вам предполагаемое поведение, которое вы хотите.

person Makoto    schedule 31.12.2013

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

в вашем условии while вы уже убедитесь, что current не равно null (используя current.key!=key) , поэтому нет смысла перепроверять его в if(current==null). если current=null, то вы получите исключение NullPointerException в вашем while(), и вы даже не достигнете условия if.

person TheLostMind    schedule 31.12.2013

Если current.key еще не вызвал исключение NullPointerException при попытке доступа к члену ключа, то current не может быть нулевым в начале цикла while. Когда тест перемещается в конец цикла, текущему присваивается новое значение, которое компилятор распознает как потенциально нулевое.

person Ned    schedule 31.12.2013