2012-01-03 63 views
17

我正在使用Eclipse Helios IDE進行Web應用程序開發。 在Eclipse的Problems部分下,對於某些行,描述顯示爲「Dead Code」。Dead Code在Eclipse IDE中的含義是什麼問題

有沒有人可以告訴我死碼的含義是什麼?

請參閱屏幕截圖供您參考。

enter image description here

例如,這部分被示出爲死代碼的Eclipse

else { 
     int length; 
     if (ar != null) 
      length = Array.getLength(ar); 
     else 
      length = 0; // This line is dead code 
+1

大概是因爲它可以證明'ar'永遠不會爲空在那裏 - 沒有更多的代碼,我們不能肯定地說(但除此之外,它會是一個錯誤,我更傾向於在你的代碼中搜索錯誤,而不是在eclipse編譯器中;)) – Voo 2012-01-03 14:38:22

+0

只需要注意 - Eclipse有時會出錯。我已經看到Eclipse Neon爲可能未死的代碼提供「死代碼」錯誤。 – 2016-11-24 19:24:27

回答

35

下在Eclipse中,「死代碼」是一個將永遠不會被執行的代碼。通常它在條件分支中從邏輯上不會被輸入。

一個簡單的例子是以下幾點:

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

這不是一個錯誤,因爲它仍然是有效的Java,但它是一個有用的警告,尤其是如果邏輯條件複雜,以及它可能不直觀明顯的是代碼將會執行永不

在您的具體示例中,Eclipse已計算出ar將始終爲非空值,因此else length = 0分支將永遠不會執行。

是的,它是可能 Eclipse是錯誤的,但它更有可能不是。

+0

我修改了我的問題,我的問題是請告訴我Eclipse如何確定這是死代碼?因爲在我看來Eclipse的建議可能也是錯誤的知道? – Pawan 2012-01-03 14:26:46

+0

@skaffman,是否刪除了死代碼以便它不出現在字節碼中? – Pacerier 2014-09-06 15:04:52

+0

它救了我...... – 2015-11-18 14:02:05

5

死代碼是永遠不會執行的代碼,例如,

boolean b = true 
if (!b) { 
    .... 
    // dead code here 
} 
3

死代碼意味着,沒有辦法執行此代碼。

有時你甚至不能編譯(這樣的情況下:)

private Boolean dead_code() 
    { 
    return true; 
    //Dead code below: 
    dosomething(); 
    } 

但在其他情況下,這是不是太明顯了,如這樣的說法:

b=true; 
    [...] 
    if (b==false) 
    { 
    //Dead code 
    } 

如果您有這消息,你代碼中的一些主要缺陷。你必須找到它,否則你的應用程序將無法按預期工作。

+0

我喜歡你的第一個例子,但不同意「有**是一些主要缺陷」。這不一定是這樣,例如我經常使用靜態布爾「調試」參數,只有當參數設置爲true時纔會執行一些代碼。對於發佈版,我將參數更改爲false,因此我會收到很多死代碼警告,因爲「調試」代碼部分將永遠不會執行。 – THelper 2012-01-04 06:50:21

+0

你說得對,我沒有想到這種情況。這確實會導致很多死代碼。 – Force 2012-01-04 07:07:27

1

Eclipse提供了兩種診斷方法,用於標記將在運行時可能不會執行的代碼。 1)無法訪問的代碼:這些通常是遵循JLS不可達規則的java警告,也是由javac提供的。這些意味着編譯錯誤。例子:

int foo() { 
     return 1; 
     int i = 1; // Unreachable 
    } 
    int foo2() { 
    while (true); 
    int i =1; //Unreachable 
    } 

還有其他更復雜的例子:)

2)死代碼:這是Eclipse的自己的靜態分析警告,並且大多捆綁了無效分析即

void foo() { 
    Object o = null; 
    if (o == null) { 
    } else { 
    // dead code 
    } 

上面給出的例子不應該給出死碼警告。即

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

不應該給出警告,因爲JLS禁止編譯器評估變量的'值'。所有這一切我們可以評估是「NULL的含量」

希望這有助於

1

你可能得了在上面的「死代碼」行線的空指針異常。 確保檢查「空指針」異常。

+0

我也會說:你可能會有一個編譯器明顯的Null指針異常:),即一個條件,如果你的代碼肯定會導致Null指針異常的那條警告,這樣連編譯器都能理解這一點。 – XMight 2016-05-26 09:17:51

-1

試試這個:

while (true) { 
    if(false == true) break; 

} 

S.O.P("I will never reach here!") <-- This code will never be executed. 

的代碼是有效的,因爲它符合編譯器,然而,在現實中的循環將永遠不會退出,實際上S.O.P永遠不會被執行。

0

您可能以前使用過變量ar。然後編譯器知道else語句中的行永遠不會被執行。在您使用ar的地方或者if語句的第一部分將被執行的地方將會有一個NullPointerException

0

讓我給死代碼一些答案。

例如:

public class UnreachableTest{ 

    public static void main(){ 

     try{ 
      // some code 
     } 
     catch(Exception exc){ 
      throw new NullPointerException(); 
      System.out.println("Unreachable line"); // compile time error 
     } 
    } 

} 

這裏的System.out.println( 「不可到達線」);永遠不會執行。 這反過來被認爲是一個死代碼。

另一個示例可以是:

int func(int i, int j) 
{ 
int sum = i + j; 
return i + j; // never actually using the sum 
} 

簡單函數返回I + J;從未真正使用過總和。 總和在這裏被認爲是死代碼。

0

發生這種情況時的其他一些情況。

System.out.println("result :" + result + ":" + result.isEmpty()); 
if (result == null) 
    return result; 
else if(!result.isEmpty()) 
    str.append(result + " "); 

1)在這裏,你要打印結果和檢查的isEmpty()日食假設結果不爲空,所以它不會去當。所以返回結果是死代碼。

2)現在,讓我們說,結果來了空,因此你會得到result.isEmpty NullPointerException異常(),所以如果再不會去和返回結果是deadcode

爲了使這項工作只是註釋掉系統。通過out.println()。

0

如果您提供的條件檢查可能永遠不會得到滿足,Eclipse會發出此警告。以下是一些例子

Object o=null; 
if(o!=null) { 
//Some code 

} 

這裏死代碼警告會作爲對象已經由空

另一個例子如下

BSTTest bstTest=null; 
bstTest.test=10; 
if(bstTest==null) { 
    //some code 

} 

下面的代碼試圖訪問的一個變量提供類。由於變量已經被訪問,eclipse將在if(bstTest == null)中給出死代碼警告,因爲當變量已經被訪問時bstTest可能不爲null。

注:這裏bstTest.test會給空指針異常