Eclipse死代码警告 - 为什么我得到它?

时间:2016-01-08 19:15:03

标签: java eclipse java-7

在以下循环中,listeners是数组列表。 Eclipse向我显示警告i++是死代码。我现在已经完整地添加了完整的for循环,因为它存在于代码中。监听器被传递给函数,我不认为Eclipse有办法检测列表是否为空

for (int i = 0; i < listeners.size(); i++) {
  listener = getMessageListener(i);
  while (listener.isMessageAvailable()) {
    fireJob(listener);
  }
  log.info("Placed all the pending jobs because of termination signal");
}

但是,以下简单循环不会生成相同的警告

for (int y = 0; y < 10; y++) {
    System.out.println(y);
}

对我来说,两者看起来功能相同 - 循环标准。 Eclipse非常具体地突出显示i++区域,修复方法是删除i++

另一个观察是,如果我将相同的循环复制到其他地方,我就不会收到警告。所以有一种可能性就是eclipse可以考虑循环赢得的任何原因。但是块中的代码会被执行。

1 个答案:

答案 0 :(得分:1)

有一种想法:如果您注释掉log.info(...行,警告会消失吗?因为如果Eclipse确定某些东西导致循环提前终止,则必须是因为以下原因之一:

  1. 条件总是错误的。但这会使身体无法访问,因此身体上出现无法访问代码错误。 不是你的情况

    例如:在此示例中,y++死代码,但正文是无法访问的代码

    for (int y = 0; false; y++) {
        System.out.println(y);
    }
    
  2. 在最后一个语句之前的一些语句正在终止你的循环。但是,然后一些身体将无法到达或死亡。 不是你的情况

    例如:在此示例中,y++死代码无法访问代码中的println

    for (int y = 0; y < 10; y++) {
        break;
        System.out.println(y);
    }
    
    在此示例中,

    y++println死代码

    for (int y = 0; y < 10; y++) {
        if (true) {
            break;
        }
        System.out.println(y);
    }
    
  3. last语句终止循环。这只会使i++ 死代码不是你的情况,但是应该通过评论最后一个陈述来测试它不是你的情况。

    例如:在此示例中,只有y++ 死代码,但注释掉break表示没有死代码

    for (int y = 0; y < 10; y++) {
        System.out.println(y);
        break;
    }
    
  4. 所以,我相信,如果在循环中注释掉最后一个语句(在你的情况下为log行)并没有使死代码警告消失,你一定找到了一个bug在警告生成器/编译器中。如果是这样,我希望你可以减少它,以便提交适当的错误报告。