2013-02-22 123 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