2013-02-22 77 views
7

下面的代码给了我一个“死代码”警告在Eclipse:不需要死代码警告在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编译器忽略。

但是,这个根是我的班级中的私人领域,因此我需要为我的程序的功能做到这一点。

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

+1

是那个实际的代码? – 2013-02-22 01:53:54

+2

做一次清理并重新编译代码,Eclipse偶尔错误一次。 – 2013-02-22 01:55:02

+1

我认为唯一可能发生的情况是,如果root不可能为空。也许看看这个变量的用处。 – austin 2013-02-22 01:55:21

回答

2

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

编译器应该可以正常工作......它只是一个IDE警告。我的猜测是Eclipse会执行某种代码遍历(类似于Cyclomatic复杂工具)来确定代码路径并找到“死代码”和“无法访问的代码”。

我会尝试刷新,然后做一个干净的和建立在IDE中。如果没有解决这个问题,Eclipse可能会对死代码发出警告“误报”。不会是第一次......我同时使用Eclipse和IntelliJ IDEA,并且看到两个IDE在代码之前都错误地提醒过代码。不过,尽管有IDE警告,我的代码仍然可以编译。

2

可能出现两个问题:第一:问题是行根没有被“使用”。在FindBugs的相同的错误被称为“死店”当中,每findbugs指:

该指令将一个值分配给本地变量,但该值不被读取或以任何后续指令使用。通常,这表示出现错误,因为计算的值从不使用。

请注意,此处的关键字是“经常”。

我会检查并确保root的使用正如你所期望的那样,如果是这样的话,正如Philip Tenn所说的那样,是一种误报。

第二:您的问题可能与this issue有关。

1

由于源不足以找到确切的原因,我猜它与涉及到死代码的eclipse中的问题有关。有些问题可以检查herehere

0

看看你的条件。

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

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

+0

请注意,我制作了'e',但是我正在检查'n'。 – golddove 2014-01-15 22:19:45

+0

对不起,我一直回头看原版,并发表了很多次,我在那里看到了'n'。也许我太累了;) – efritz 2014-01-16 00:14:24