Ответ
Вызов любого метода на null-ссылке вызывает NullPointerException.
Пример:
String str = null;
boolean result = str.equals("hello"); // NullPointerException!
Безопасные подходы для сравнения:
-
Вызов equals() на литерале или заведомо не-null объекте
String str = null; boolean result = "hello".equals(str); // false, без исключения -
Использование Objects.equals() (Java 7+)
import java.util.Objects; String str1 = null; String str2 = "hello"; boolean result1 = Objects.equals(str1, str2); // false boolean result2 = Objects.equals(null, null); // true -
Явная проверка на null
public boolean safeEquals(String a, String b) { if (a == null) { return b == null; // оба null → true, иначе false } return a.equals(b); // a не null, можно безопасно вызывать equals }
Реализация Objects.equals():
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
Особенности для собственных классов:
public class Person {
private String name;
@Override
public boolean equals(Object o) {
// 1. Проверка ссылки
if (this == o) return true;
// 2. Проверка null и класса
if (o == null || getClass() != o.getClass()) return false;
// 3. Сравнение полей
Person person = (Person) o;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
Важно: Всегда переопределяйте hashCode() вместе с equals() для корректной работы с коллекциями.