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

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

}

5 ответов

Решение

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

Так как

while (current.key != key) // <-- current.key would throw NPE if current was null.

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

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

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

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

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

Другие вопросы по тегам