我有一个非常简单的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最终仍然适用。如果您在死代码块之前返回,它将引发无法访问的代码错误。
正如其他人所说,无法复制它。