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

Анализатор обнаружил, что в методе equals происходит явный выброс исключения\. Такое поведение нежелательно, поскольку этот метод может использоваться там, где выброс исключения не подразумевается\. Это может происходить как в пользовательском коде, так и при работе со стандартной библиотекой\. 

Рассмотрим пример: 

```cpp
class User {
  ....
  @Override
  public boolean equals(Object o) {
    if (o == null) {
      throw new IllegalArgumentException("....");
    }
    ....
  }
}
```

По [контракту](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)) метод [`Object.equals`](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-) возвращает `false`, если в качестве аргумента был передан `null`\. В переопределении метода вместо этого происходит выброс исключения [`IllegalArgumentException`](https://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html)\. Это может привести к проблеме, когда объект используется в коллекции\. Рассмотрим на примере:

```cpp
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`\.

Исправленный пример:

```cpp
@Override
public boolean equals(Object o) {
  if (o == null) {
    return false;
  }
  ....
}
```