这是我的代码:
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错误还是这个警告是正确的(在这种情况下我应该如何编写代码)?
答案 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,而不是实际修改源代码到对我没用的东西。