-3

我有一个非常简单的 Java 代码,就像这样(这只是一个摘录):

for(;;)
{
  AnObject object = null;
  for(AnObject elem : list) // where the list is of the type List<AnObject>
  {
    if(<some dynamic condition goes here>)
    {
      object = elem;
    }
  }

  Log.v(TAG, object.property); // was initially omitted, added for the answer

  // more code skipped for simplicity

  if(object == null)
  {                  //
    break;           //
  }                  // this all is marked as dead code
}

在 Eclipse 中,带有注释的片段被标记为死代码。为什么?条件中没有final元素。除了循环的最开始,该object变量不会在任何地方分配给常量 null,在此之后它通常应该被覆盖,但它并不总是发生。object可以很好地为空和非空。

我错过了什么吗?

答案

好吧,我找到了答案,为了展示它,我必须在我的示例中添加一行代码,我在尝试简化代码摘录时无意中省略了这行代码,但这很重要。该行是:

Log.v(TAG, object.property);

所以对象必须是非空的,否则代码无法通过异常访问。此行是出于调试目的临时添加的,这就是我不考虑它的原因。

4

3 回答 3

1

我无法在 Eclipse 中重现该警告。

可能是您不小心忘记了原始问题中的某些代码,这可能会导致没有执行其后面的代码的情况。当您将完整的语句标记if为死代码而不仅仅是它的主体时,情况似乎就是这样。缺少的行可能是实际使用的东西object(可能就像您尝试访问其中一个object属性的日志语句一样简单)。

即使if状况没有被标记为死亡,它的尸体也可能仍然存在。要么object不是null(并且if主体不会被执行),要么 - 如果object为 null - aNullPointerException将被抛出该缺失的行,以便执行在那里停止。

于 2012-07-11T16:28:38.113 回答
0

无法使用以下程序重现:

import java.util.Date;
import java.util.LinkedList;
import java.util.List;


public class Test {

    public static void main(String[] args) {
        for(;;)
        {
            List<Object> list = new LinkedList<Object>();
          Object object = null;
          for(Object elem : list) 
          {
            if(new Date().getSeconds() % 3 == 0)
            {
              object = elem;
            }
          }
          if(object == null) 
          {                  
            break;           
          }                  
        }

    }

}

这是带有 Java SE 1.7 的 Eclipse 3.7.2

于 2012-07-11T14:35:46.940 回答
-1

因为,如果 list 为 null(在您的代码中没有 init for list),您将永远不会初始化 Object。 我的垃圾话,我的错。

如果内部的“如果”总是为假,则可以在其中标记死代码。如果元素为空,则最后的比较仍然适用。如果您在死代码块之前返回,则会引发无法访问的代码错误。

正如其他人所说,无法复制它。

于 2012-07-11T14:36:37.133 回答