死代码警告不应该在的地方



我有一个非常简单的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,否则代码将无法通过异常访问。这一行是为了调试而临时添加的,这就是为什么我没有考虑它。

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

可能是你在最初的问题中意外地忘记了一些代码,这可能会导致后面的代码没有被执行。当您将完整的if语句标记为死代码而不仅仅是它的主体时,情况似乎就是这样。缺失的那一行可能是实际使用object的内容(可能就像日志记录语句一样简单,您可以在其中尝试访问object的某个属性)。

即使if条件没有被标记为dead,它的主体可能仍然是。要么object不是null(并且if主体将不会被执行),要么——如果object为null——NullPointerException将被抛出到缺失的行中,这样执行就停止了。

无法使用以下程序进行复制:

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

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

如果内部的"If"总是为false,那么死代码就可以标记在里面。如果元素为null,那么comparisson最终仍然适用。如果您在死代码块之前返回,它将引发无法访问的代码错误。

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

相关内容

  • 没有找到相关文章

最新更新