2014-09-01 122 views
1

我使用Eclipse 4.3 Kepler(實際上是STS 3.6.1)。刪除死代碼導致錯誤

我碰到了一些代碼:

private String someMethod(String myParam) { 
    try { 
     MyInterface myVar = (MyInterface) domeSomething(myParam); 
     if (myVar != null) { 
      return myVar.methodThatReturnsString(); 
     } 
    } catch (Exception e) { 
     return ""; 
    } 
    return ""; // eclipse marks this as dead code 
} 

(正如你所期望的,doSomething()方法拋出一些異常,並返回一個接口要比MyInterface比較一般。)

Eclipse中強調了最後返回語句爲死代碼,如果我刪除它作爲quickfix建議,我和「這種方法應該返回一個字符串類型的結果」錯誤。

爲什麼最後一個return語句無效代碼?是因爲班級演員?假設doSomething()可以返回null,如果你投了它,會拋出一個類拋出異常嗎?

而且,Eclipse爲什麼建議我修復導致死代碼警告的錯誤?是否因爲Eclipse無法預測這一點?

+0

刪除'catch'塊中的'return'「'。請注意,'someMethod'除了'String',但你正在嘗試返回'MyInterface' ...好像你有更大的問題 – MadProgrammer 2014-09-01 07:23:35

+0

真的很抱歉那個錯誤,它確實返回一個String。現在更正:) – eivamu 2014-09-01 07:27:19

+0

完全不同的東西:我喜歡你的標誌! – Seelenvirtuose 2014-09-01 07:34:45

回答

6

您的發佈代碼中沒有死代碼。我能看到的唯一的問題是在這裏:

if (myVar != null) { 
    return myVar; 
} 

你返回一個MyInterface時,你應該返回String。編譯器會抱怨它,這是正確的。

此外,作爲一個更好的選擇,您不應該直接返回trycatch塊內,而應在該塊之後設計一個位置以返回結果。這將使您的代碼避免任何死代碼編譯器錯誤。你可能應該是這樣的:

private String someMethod(String myParam) { 
    String result = ""; 
    try { 
     MyInterface myVar = (MyInterface) domeSomething(myParam); 
     if (myVar != null) { 
      result = myVar.methodThatReturnsString(); 
     } 
    } catch (Exception e) { 
     //handle the exception 
     //basic handling shown 
     System.out.println("Warning. There was a problem executing someMethod:"); 
     e.printStacktrace(); 
    } 
    return result; 
} 
+0

真的很抱歉,我的文章有錯誤。它應該返回一個字符串。現在更正。再一次,對不起:) – eivamu 2014-09-01 07:26:40

+1

@eivamu無論如何。這是你代碼中唯一的*問題*。除此之外,請按照我的帖子的最後部分。 – 2014-09-01 07:28:14

+1

+1爲一個入口,一個出口:) – MadProgrammer 2014-09-01 07:28:43

2

您最有可能使用的方法domeSomething Eclipse的註解org.eclipse.jdt.annotation.NonNull

在這種情況下,Eclipse編譯器知道變量沒有引用null,因此代碼將返回變量(BTW:這是另一個編譯器錯誤,因爲該變量不是String類型)或拋出一個將返回空字符串的異常。最後一行確實是死代碼。因此,警告。

但是,刪除最後一行會導致代碼不符合JLS。因此,編譯器錯誤。

+0

情況並非如此(不使用Eclipse註釋),但在類似情況下可能會出現這種情況,所以非常感謝您提供了有用的建議。 – eivamu 2014-09-01 08:37:04