V6134. It is not recommended to throw exceptions from the 'equals' method.
Анализатор обнаружил, что в методе equals происходит явный выброс исключения. Такое поведение нежелательно, поскольку этот метод может использоваться там, где выброс исключения не подразумевается. Это может происходить как в пользовательском коде, так и при работе со стандартной библиотекой.
Рассмотрим пример:
class User {
....
@Override
public boolean equals(Object o) {
if (o == null) {
throw new IllegalArgumentException("....");
}
....
}
}
По контракту метод Object.equals возвращает false, если в качестве аргумента был передан null. В переопределении метода вместо этого происходит выброс исключения IllegalArgumentException. Это может привести к проблеме, когда объект используется в коллекции. Рассмотрим на примере:
List<User> users = new ArrayList<>();
users.add(null);
users.add(new User("a@example.com"));
//....
users.contains(new User("b@example.com")); // IllegalArgumentException
Метод ArrayList.contains использует внутри себя equals для сравнения переданного аргумента с элементами коллекции. Поскольку коллекция содержит объект, ссылающийся на null, при его передаче в метод equals произойдёт выброс IllegalArgumentException.
Чтобы избежать подобных проблем, рекомендуется вместо выброса исключения возвращать соответствующее значение типа boolean.
Исправленный пример:
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
....
}