我的 else 语句中的代码已死,我不相信这是真的 (java)?

the code in my else statement is dead and I don't believe it is true (java)?

我在 java 代码中使用有组织的 BST。 function/method 应该在树中搜索具有特定值的节点,并让用户知道它是否存在。

    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 语句中的任何内容都是死代码,这意味着它没有被使用。但是,如果函数确实遇到 null 并且找不到具有分配值的节点,我需要该 else 语句中的代码。如果我将第二个 else 语句更改为 else if(root.val != item && root != null) 它就会消失,但它让我想知道是否存在 root 不等于 null 我知道这应该是可能的。 else 语句真的是死代码吗?如果是,我该如何更改它?

你的第一个 if 表达:

if (root.val == item)
如果 rootnull

将抛出 NullPointerException,否则将执行比较。因此,最终的 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");
    }
 }

它是死代码,因为 root.val 中对 root 的取消引用要求 root 不是 null。如果是 null 你会得到 NullPointerException.

在我的 IDE 中,这是一个警告;该代码在语法上是正确的,但从语义上讲,最终的 else 将永远不会被输入。

要解决此问题,请先检查 if 语句中的 null

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,使其直接 return 或停止执行该方法。然后检查 item < root.val 不必在 else 块内。 if 语句越浅越好(但始终对每个块使用大括号!)。