为什么这段代码标记为死代码?

时间:2014-10-07 14:01:46

标签: java dead-code

对于我的生活,我不明白为什么Eclipse将下面的else if条款标记为"死代码":

BaType rbName = rSoapXml.getName().getBName();
BaType cbName = cSoapXml.getName().getBName();
IaType riName = rSoapXml.getName().getIName();
IaType ciName = cSoapXml.getName().getIName();

String rbNameF = rbName.getF() == null ? "null" : rbName.getF();
String cbNameF = (cbName == null || cbName.getF() == null) ? "null" : cbName.getF();
LOG.info("\n***BEFORE***: " + rbNameF + ", COM: " + cbNameF);

if (cbName != null) {
  if (riName != null) {
    String errMsg = "Expected an I message but received a B instead.";
    throw new RuntimeException(errMsg);               
  }
  if (cbName.getBorE() != null)
    rbName.setBorE(cbName.getBorE());
  if (rbName.getBorE() == null && cbName.getBorE() == null) {
    String errMsg = "Missing B name!";
    throw new RuntimeException(errMsg);               
  }
}
else if (ciName != null) {                                               // dead
  if (rbName != null) {                                                  // dead  
    String errMsg = "Expected a B message but received an I instead.";   // dead
    throw new RuntimeException(errMsg);                                  // dead
  }                                                                      // dead
  if (ciName.getIName() != null)                                         // dead
    riName.setIName(ciName.getIName());                                  // dead
  if (riName.getIName() == null && ciName.getIName() == null) {          // dead
    String errMsg = "Missing I name";                                    // dead
    throw new RuntimeException(errMsg);                                  // dead 
  }

}

我考虑的要点:

  1. ciName在运行时初始化,不能保证为非null。
  2. cbName也不保证非空,因此检查后的else应该有效。
  3. 我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

编译器错误,这应该被认为是Eclipse编译器错误。通常情况下,编译器会断定您之前是解除引用变量,这样可以确保在代码中稍后变量为非null。它可能会被这条线弄糊涂:

String cbNameF = (cbName == null || cbName.getF() == null) ? "null" : cbName.getF();

您似乎在这里取消引用cbName,但实际上只有在 null时才会尊重它。在您检查变量时,该变量可能合法地为null,而else分支并未死亡。

如果您正在使用Eclipse进行编译,那么请与参考编译器(javac)进行交叉检查。