Eclipse IDE 问题部分下的死代码是啥意思

Posted

技术标签:

【中文标题】Eclipse IDE 问题部分下的死代码是啥意思【英文标题】:what does Dead Code mean under Eclipse IDE Problems SectionEclipse IDE 问题部分下的死代码是什么意思 【发布时间】:2012-01-03 14:15:03 【问题描述】:

我正在使用 Eclipse Helios IDE 进行 Web 应用程序开发。 在 Eclipse 的问题部分下,对于某些行,描述显示为“死代码”。

谁能告诉我死代码到底是什么意思?

请查看屏幕截图以供参考。

比如这部分在Eclipse下显示为死代码

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

【问题讨论】:

大概是因为它可以证明ar 永远不会在那里为空 - 没有更多代码我们不能肯定地说(但否则它会是一个错误,我更倾向于搜索对于代码中的错误,而不是 eclipse 编译器中的错误;)) 值得注意的是——Eclipse 有时会出错。我已经看到 Eclipse Neon 对可证明没有死的代码给出“死代码”错误。 【参考方案1】:

在 Eclipse 中,“死代码”是永远不会执行的代码。通常它在逻辑上永远不会进入的条件分支中。

一个简单的例子如下:

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

这不是错误,因为它仍然是有效的 java,但它是一个有用的警告,尤其是在逻辑条件很复杂的情况下,并且代码可能不会在直观上明显永远被执行.

在您的具体示例中,Eclipse 计算出ar 将始终为非空,因此永远不会执行else length = 0 分支。

是的,可能Eclipse 是错误的,但更可能的是它不是。

【讨论】:

我已经修改了我的问题,我的问题是请告诉我 Eclipse 如何确定这是死代码?因为在我看来 Eclipse 的建议可能也是错误的知道吗?? @skaffman,是否已删除死代码以使其不会出现在字节码中?【参考方案2】:

死代码是永远不会被执行的代码,例如

 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
    

如果您收到此消息,则说明您的代码存在一些重大缺陷。您必须找到它,否则您的应用将无法按预期运行。

【讨论】:

我喜欢您的第一个示例,但不同意“存在一些重大缺陷”。不一定是这样,例如我经常使用静态布尔“调试”参数,只有当参数设置为 true 时才会执行一些代码。对于版本,我将参数更改为 false,结果我收到很多死代码警告,因为“调试”代码部分永远不会被执行。 你说得对,我没有想到这个案子。这确实会导致大量死代码。【参考方案4】:

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 禁止编译器评估变量的“值”。我们可以评估的只是“空性”

希望对你有帮助

【讨论】:

【参考方案5】:

您可能在“死代码”行上方的行中遇到空指针异常。 确保检查“空指针”异常。

【讨论】:

我还要说:您可能有一个编译器明显的空指针异常:),即如果您的代码肯定会导致在发出该警告的行上出现空指针异常,那么即使编译器理解这一点。【参考方案6】:

您之前可能使用过变量ar。然后编译器就知道 else 语句中的那一行永远不会被执行。在您使用ar 的地方将有一个NullPointerException,或者将执行if 语句的第一部分。

【讨论】:

【参考方案7】:

让我为死代码给出一些答案。

例如:

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("Unreachable line");永远不会被执行。 这又被认为是死代码。

另一个例子可能是:

int func(int i, int j)

int sum = i + j;
return i + j; // never actually using the sum 

简单函数返回i + j;从来没有真正使用过总和。 Sum 在这里被认为是死代码。

【讨论】:

【参考方案8】:

发生这种情况的其他情况。

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

1) 在这里,您正在打印结果并检查 isEmpty() eclipse 假定结果不为空,因此它不会进入 if。所以返回结果是死代码。

2) 现在假设结果为 null,因此您将在 result.isEmpty() 中获得 NullPointerException,因此如果返回结果为死码,它将不会进入

要完成这项工作,只需注释掉 System.out.println()。

【讨论】:

【参考方案9】:

如果您提供的条件检查可能永远不会得到满足,Eclipse 会发出此警告。以下是一些例子

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


这里会出现死代码警告,因为 Object 已经设为 null

下面给出另一个例子

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


这里的代码试图访问类的变量。由于变量已经被访问,eclipse会在if(bstTest==null)中给出死代码警告,因为当变量已经被访问时,bstTest可能不为空。

注意:这里bstTest.test会给出空指针异常

【讨论】:

【参考方案10】:

死代码的简单示例

public class IfTest 

    public static void main(String[] args) 

        if (true) 
            if(false) 
                System.out.println("a"); //Dead code, Never be Execute this if block.
            else 
                System.out.println("b");
            
        
    

【讨论】:

【参考方案11】:

为了简化术语的 Unreachable code 和 dead code:

无法访问的代码是 Java 中的代码块/语句,控件在程序的生命周期内永远不会到达并且永远不会被执行。以下是无法访问代码的示例。这会产生编译时错误。

public void unreachableCodeExample() 
     System.out.println("This will execute");
     return;
     System.out.println("This will not"); //This is Unreachable code
 

While A Dead code 是无法访问的代码,但不会产生编译时错误。但是如果你在 Eclipse(或其他 IDE)中执行它,它会给你一个警告。见下面的例子,

public void deadCodeExample() 
        if (true) 
            System.out.println("This will execute");
            return;
        
        System.out.println("This will not"); //This is dead code
    

【讨论】:

【参考方案12】:

死代码是我们代码中永远不会执行运行时的部分,它没用 例如:

if(false) // statements 

更多例子你可以参考:DeadCode Examples

【讨论】:

【参考方案13】:

试试这个:

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



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

代码是有效的,因为它符合编译器,但实际上循环永远不会退出,实际上 S.O.P 永远不会被执行。

【讨论】:

以上是关于Eclipse IDE 问题部分下的死代码是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse IDE问题部分中死代码的含义是什么

dorado是啥意思啊

请求标头的客户端部分下的“接受:*/*”是啥意思?

eclipse下的server插件

为什么Eclipse中的FreeMarker IDE氧气JBoss工具4.5.2.Final已被弃用?

这个灰色三角形箭头在 IntelliJ 中是啥意思?