我有一个非常简单的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,否则代码无法通过异常访问。为了调试目的,这一行是临时添加的,这就是为什么它不在考虑之列。
答案 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仍然适用。 如果在死代码块之前返回,则会引发无法访问的代码错误。
正如其他人所说,无法复制它。