resources.report.rules.pmd.UnusedNullCheckInEquals.html Maven / Gradle / Ivy
UnusedNullCheckInEquals
UnusedNullCheckInEquals
After checking an object reference for null, you should invoke equals() on that object rather than passing it to another object’s equals() method.
(//PrimaryPrefix[ends-with(Name/@Image, '.equals') and Name/@Image != 'Arrays.equals'] | //PrimarySuffix[@Image='equals' and not(../PrimaryPrefix/Literal)])
/following-sibling::PrimarySuffix/Arguments/ArgumentList/Expression
/PrimaryExpression[count(PrimarySuffix)=0]/PrimaryPrefix
/Name[@Image = ./../../../../../../../../../../Expression/ConditionalAndExpression
/EqualityExpression[@Image="!=" and count(./preceding-sibling::*)=0 and
./PrimaryExpression/PrimaryPrefix/Literal/NullLiteral]
/PrimaryExpression/PrimaryPrefix/Name/@Image]
Example(s):
public class Test {
public String method1() { return "ok";}
public String method2() { return null;}
public void method(String a) {
String b;
// I don't know it method1() can be "null"
// but I know "a" is not null..
// I'd better write a.equals(method1())
if (a!=null && method1().equals(a)) { // will trigger the rule
//whatever
}
if (method1().equals(a) && a != null) { // won't trigger the rule
//whatever
}
if (a!=null && method1().equals(b)) { // won't trigger the rule
//whatever
}
if (a!=null && "LITERAL".equals(a)) { // won't trigger the rule
//whatever
}
if (a!=null && !a.equals("go")) { // won't trigger the rule
a=method2();
if (method1().equals(a)) {
//whatever
}
}
}
}