Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Автоматизация анализа с помощью PVS-Studio - 26.03

menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V6134. It is not recommended to throw exceptions from the 'equals' method.

06 Мар 2026

Анализатор обнаружил, что в методе 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;
  }
  ....
}