7

以下代码在 Eclipse 中给了我一个“死代码”警告:

private void add(Node<E> n, E element) {
        Node<E> e = new Node<E>(element);
        if (n == null)
            root = e;
        else if (n.compareTo(e) > 0)
            if (n.hasLeft())
                add(n.getLeft(), element);
            else
                n.setLeft(e);
        else if (n.hasRight())
            add(n.getRight(), element);
        else
            n.setRight(e);
        balance(e);
    }

警告出现在root = e;.

我查找了死代码,发现它是代码帽没有效果,因此会被 java 编译器忽略。

但是,这个根是我班级中的一个私有字段,因此我的程序功能有必要这样做。

编译器真的会忽略这一点吗?我怎么能阻止它?为什么它认为它是死代码?

4

4 回答 4

2

如果root是您的类中包含add您发布的方法的私有字段,那么,正如您所说,root = e;Eclipse IDE 不应将该行视为死代码。

编译器应该可以正常工作......这只是一个 IDE 警告。

我的猜测是 Eclipse 会执行某种代码遍历(类似于循环复杂度工具)来确定代码路径并找到“死代码”和“无法访问的代码”。

我会尝试刷新,然后在 IDE 中进行清理和构建。如果这不能解决它,Eclipse 可能只会对死代码发出“误报”警告。不会是第一次......我同时使用 Eclipse 和 IntelliJ IDEA,并且之前看到这两个 IDE 都错误地警告代码。但是,尽管有 IDE 警告,我的代码仍然可以正常编译。

于 2013-02-22T02:03:21.740 回答
2

可能有两个问题:首先:问题是行根没有“用于”任何东西。在 findbugs 中,同样的错误被称为“死存储”,根据findbugs的含义:

该指令为局部变量赋值,但在任何后续指令中都不会读取或使用该值。通常,这表示错误,因为从未使用过计算的值。

请注意,这里的关键字是“经常”。

我会检查并确保 root 正在按照您的预期使用,如果是的话,正如 Philip Tenn 所提到的,它可能是误报。

第二:您的问题可能与这个问题有关。

于 2013-02-22T02:03:47.130 回答
1

由于来源不足以找到确切的原因,我猜它与 Eclipse 中与死代码相关的问题有关。您可以在此处此处查看一些问题。

于 2013-02-22T02:14:50.793 回答
0

看看你的 if 条件。

Node<E> e = new Node<E>(element);
if (n == null) {
    // dead code here
}

这段代码已经死了,因为它总是n == null错误的。您刚刚在上一行创建了一个新实例(无条件地)。新对象永远不会为空。Node<E>

于 2014-01-15T05:51:37.863 回答