【问题标题】: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 对可证明没有死的代码给出“死代码”错误。

标签: java eclipse


【解决方案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 永远不会被执行。

                    【讨论】:

                      猜你喜欢
                      • 2020-03-08
                      • 1970-01-01
                      • 2011-03-26
                      • 1970-01-01
                      • 2021-10-30
                      • 1970-01-01
                      • 2011-04-21
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多