Задать вопрос
@Ezekiel4
Охотник на пиратов и сборщик монолитов

Почему использование .equals(null) плохо?

Недавно закончил свой первый учебный проект на java. Искал код-ревью и узнал про существование статических анализаторов кода, вроде findbugs. Установил SpotBugs Eclipse Plugin и дал команду проверить свой проект. Он нашёл ошибку, которую я не понимаю.

На основе JButton я сделал круглую кнопку и для неё написал функцию назначения цвета (переменная класса color_normal), которая также назначает "обратный" цвет (color_pressed) для нажатого состояния.

public void setColor(Color c) {
	color_normal = c.equals(null) ? Color.WHITE : c;
	color_pressed = c.equals(null) ? Color.GRAY : new Color(255 - color_normal.getRed(), 255 - color_normal.getGreen(), 255 - color_normal.getBlue());
}


Отчёт о баге:
Bug: Call to equals(null) in guijcalc.ui.CircleButton.setColor(Color)
This method calls equals(Object), passing a null value as the argument. According to the contract of the equals() method, this call should always return false.
Rank: Scary (9), confidence: Normal
Pattern: EC_NULL_ARG
Type: EC, Category: CORRECTNESS (Correctness)


Почему использование .equals(null) плохо? Разве в данном контексте оно отличается от obj == null? Или может есть способ лучше?
  • Вопрос задан
  • 1369 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Ну там же написано, ты хоть прочитал? Давай процитирую:
This method calls equals(Object), passing a null value as the argument. According to the contract of the equals() method, this call should always return false.

Даже онлайн переводчик справился.
В твоём случае надо писать c == null ? Color.WHITE : c;
Также лучше использовать какие-нибудь из аннотаций NonNull/Nullable.
Ответ написан
Комментировать
@boristhecat
Разве в данном контексте оно отличается от obj == null?

Отличается. Если obj равен null, то obj == null вернёт true, а obj.equals(null) выкинет java.lang.NullPointerException, так как Вы пытаетесь вызвать метод, используя ссылку, которая ни на что не ссылается (null).
Как уже верно написал Денис Загаевский, используйте c == null ? Color.WHITE : c.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы