PMD验证" x!= y"

时间:2014-07-01 12:14:55

标签: java pmd

这是我的代码:

private void showMessageForInvalid(File aFile) {
  if (!aFile.exists()) {
     // show not exists message
  } else if (!aFile.isDirectory()) {
     // show not directory message
  }
}

对于第一个if块,我收到PMD警告“避免x!= y else”。我认为,如果

,这个警告是正确的
if (!aFile.exists()) {
  // do something
} else {
  // do else
}

但不是我的else if声明。
这是PMD错误还是这个警告是正确的(在这种情况下我应该如何编写代码)?

2 个答案:

答案 0 :(得分:3)

首先执行exists分支:

if (aFile.exists()) {

   if (aFile.isDirectory()) {
       // Do stuff
   } else {
       // show not directory message
   }    
} else {
   // show not exists message
}

这具有相同的实际程序流程和逻辑结构,但它更清晰"一目了然"发生了什么。

答案 1 :(得分:2)

除了@Tim B的回答:

它列在Design rules as 'confusing ternary'下。

!condition块中if-else通常很糟糕。在大多数情况下,这是由于糟糕的结构:

if(healthy)
     business-logic
else
     error-handling

以上是(诚然不是每个人)人们发现的自然思路,而不是

if(!healthy)
     error-handling first
else
     business-logic later

现在,情况并非总是如此 - 您的函数(显示在其名称中)明确处理错误案例 - 是可能的例外之一。不幸的是,使用像PMD这样的静态代码分析工具,您既可以捕获所有情况,也可以捕获所有情况 - 在这种情况下,开发人员选择全部使用;诚然让它有点过分热心。

无论如何,这就是它在PMD的设计规则下列出的原因。遇到这样的情况时,我发现最简单的方法是指定a ruleset exclusion as described here,而不是实际修改源代码到对我没用的东西。