死码警告不应该在哪里

时间:2012-07-11 14:27:30

标签: java eclipse dead-code

我有一个非常简单的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很可能为null且非null。

我错过了什么吗?

答案

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

Log.v(TAG, object.property);

因此该对象必须为非null,否则代码无法通过异常访问。为了调试目的,这一行是临时添加的,这就是为什么它不在考虑之列。

3 个答案:

答案 0 :(得分:1)

我无法在eclipse中重现那个警告。

可能是您意外忘记了原始问题中的某些代码,这些代码可能导致其背后没有代码被执行的情况。当您将完整的if语句标记为死代码而不仅仅是其正文时,似乎就是这种情况。丢失的行可能是实际使用object的东西(可能就像您尝试访问object属性之一的日志语句一样简单。)

即使if条件没有被标记为死亡,它的身体仍可能是。 object不是null(并且if正文不会被执行)或者 - 如果object为空 - 那将丢失NullPointerException行,以便执行停止。

答案 1 :(得分: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

答案 2 :(得分:-1)

因为,如果list为null(在你的代码中没有列表的init),你就不会初始化Object。 我的Trashtalk,我的坏。

如果内部'if'总是变为false,则可以在其中标记死代码。 如果元素为null,则最终的comparisson仍然适用。 如果在死代码块之前返回,则会引发无法访问的代码错误。

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