Java: Как проверить, является ли объект нулевым? - PullRequest
67 голосов
/ 09 января 2010

Я создаю приложение, которое извлекает изображения из Интернета. Если изображение не может быть получено, следует использовать другое локальное изображение.

При попытке выполнить следующие строки:

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
  drawable = getRandomDrawable();
}

Строка if (drawable.equals (null)) выдает исключение, если drawable равно null.

Кто-нибудь знает, как следует проверять значение drawable, чтобы не создавать исключение в случае, если оно равно нулю, и извлекать локальное изображение (execute drawable = getRandomDrawable ())?

Ответы [ 9 ]

154 голосов
/ 09 января 2010
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
    drawable = getRandomDrawable();
}

Метод equals() проверяет равенство значение , что означает, что он сравнивает содержимое двух объектов. Поскольку null не является объектом, происходит сбой при попытке сравнить содержимое вашего объекта с содержимым null.

Оператор == проверяет равенство reference , что означает, что он проверяет, действительно ли два объекта являются очень одинаковым объектом . Это не требует, чтобы объекты действительно существовали; два несуществующих объекта (null ссылки) также равны.

32 голосов
/ 09 января 2010

Отредактированное решение Java 8:

final Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

В этом случае вы можете объявить drawable final.

Как отметил Часмо, Android на данный момент не поддерживает Java 8. Так что это решение возможно только в других контекстах.

15 голосов
/ 09 января 2010

Я использую этот подход:

if (null == drawable) {
  //do stuff
} else {
  //other things
}

Этот способ улучшает читаемость строки - при быстром чтении исходного файла я вижу, что это нулевая проверка.

Что касается того, почему вы не можете вызвать .equals() для объекта, который может быть null; если у вас есть ссылка на объект (а именно 'drawable') , равная на самом деле null, она не указывает на объект в куче. Это означает, что в куче нет объекта, для которого вызов equals() может быть успешным.

Удачи!

7 голосов
/ 17 февраля 2014

DIY

private boolean isNull(Object obj) {
    return obj == null;
}

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}
5 голосов
/ 27 сентября 2012

if (yourObject instanceof yourClassName) оценивается как false, если yourObject равно null.

5 голосов
/ 09 января 2010
drawable.equals(null)

В приведенной выше строке вызывается метод equals (...) для рисуемого объекта.

Итак, когда drawable не равно null и это реальный объект, тогда все идет хорошо, так как вызов метода "equals (null)" вернет "false"

Но когда «drawable» имеет значение null, это означает, что вызывается метод «equals (...)» для нулевого объекта, означает вызов метода для несуществующего объекта, поэтому он выдает «NullPointerException»

Чтобы проверить, существует ли объект и не является ли он нулем, используйте следующее

if(drawable == null) {
    ...
    ...
}

В приведенном выше условии мы проверяем, что ссылочная переменная "drawable" имеет значение null или содержит некоторое значение (ссылку на его объект), поэтому она не будет выдавать исключение в случае, если drawable равно нулю, как проверка

null == null

действителен.

0 голосов
/ 13 декабря 2018

Просто для того, чтобы дать несколько идей разработчику исходного кода Java: -)

Решение уже существует в .Net и более читабельно!

В Visual Basic .Net

Drawable drawable 
    = If(Common.getDrawableFromUrl(this, product.getMapPath())
        ,getRandomDrawable()
        )

In C #

Drawable drawable 
    = Common.getDrawableFromUrl(this, product.getMapPath() 
        ?? getRandomDrawable();

Эти решения являются мощными как дополнительное решение Java (строка по умолчанию оценивается, только если исходное значение равно нулю) без использования лямбда-выражения, просто при добавлении нового оператора.

Чтобы быстро увидеть разницу с решением Java, я добавил 2 решения Java

Использование Необязательного в Java

Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

Использование {} в Java

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable != null)
    {
    drawable = getRandomDrawable();
    }

Лично мне нравится VB.Net, но я предпочитаю ?? C# или if {} решение на Java ... а вы?

0 голосов
/ 24 мая 2013

Используйте Google Guava LIBS для обработки проверки "пусто" (обновление Деймона)

Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
0 голосов
/ 09 января 2010

Вероятно, немного более эффективно отловить исключение NullPointerException. Вышеуказанные методы означают, что среда выполнения проверяет нулевые указатели дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...