код в моем операторе else мертв, и я не верю, что это правда (java)? - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю с организованным BST в моем коде java. Предполагается, что эта функция / метод ищет в дереве узел с указанным значением c и сообщает пользователю, существует ли он.

    void search(int item, Node root, int r, int c) {

        //if the integer is found
        if(root.val == item) {
            System.out.println("integer located at row: " + r + " & child: " + c + "\n");
        }

        //if the integer is not found (use the closest value to find it)
        else if(root != null) {
            if(item < root.val) 
                search(item, root.left, r + 1, (c * 2) - 1);
            else
                search(item, root.right, r + 1, c * 2);
        }

        //if the root is a null (it doesn't exist or cannot be found)
        else {
            System.out.println("integer cannot be located\n");
        }
    }

Проблема заключается в утверждении else в конце. Мой компилятор говорит, что что-либо в этом операторе else является мертвым кодом, то есть оно не используется. Тем не менее, мне нужен код в этом операторе else в случае, если функция встречает ноль и не может найти узел с присвоенным значением. Это уходит, если я изменю второе выражение else на else if(root.val != item && root != null), но у меня возникает вопрос: а есть ли точка, где root не будет равняться нулю? Я знаю, что это должно быть возможно. Является ли оператор else действительно мертвым кодом, и если это так, как я могу это изменить?

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Это мертвый код, потому что разыменование root в root.val требует, чтобы root было не-null. Если бы это было null, вы бы получили NullPointerException.

В моей IDE это предупреждение; код синтаксически правильный, но, говоря семантически, окончательный else никогда не будет введен.

Чтобы решить эту проблему, сначала проверьте null в операторе if:

void search(int item, Node root, int r, int c) {
    if (root == null) {
        // if the root is a null (it doesn't exist or cannot be found)

        System.out.println("integer cannot be located\n");
    } else if (root.val == item) {
        // if the integer is found

        System.out.println("integer located at row: " + r + " & child: " + c + "\n");
    } else if (item < root.val) {
        // if the integer is not found (use the closest value to the left to find it)

        search(item, root.left, r + 1, (c * 2) - 1);
    } else {
        // if the integer is not found (use the closest value to the right find it)

        search(item, root.right, r + 1, c * 2);
    }
}

Обратите внимание, что вы можете изменить первые два if таким образом, чтобы они напрямую возвращали или останавливали выполнение метода. Тогда проверка item < root.val не обязательно должна быть в блоке else. Чем глубже ваши операторы if, тем лучше (но всегда используйте скобки для каждого блока!).

0 голосов
/ 09 февраля 2020

Ваше первое if выражение:

if (root.val == item)

либо выдаст NullPointerException, если root равно null, либо выполнит сравнение, если нет. Следовательно, последний блок else никогда не может быть выполнен.

Вы можете попробовать переупорядочить код:

void search(int item, Node root, int r, int c) {
    if (root != null) {
       if (root.val == item) {
           System.out.println("integer located at row: " + r + " & child: " + c + "\n");
       } else if (item < root.val) {
            search(item, root.left, r + 1, (c * 2) - 1);
       } else {
            search(item, root.right, r + 1, c * 2);
       }
    } else {
       System.out.println("integer cannot be located\n");
    }
 }
...