Java: Как проверить, является ли объект нулевым? - программирование
Подтвердить что ты не робот

Java: Как проверить, является ли объект нулевым?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Удачи!

Ответ 4

DIY

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

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

Ответ 5

if (yourObject instanceof yourClassName) будет оцениваться до false, если yourObject - null.

Ответ 6

drawable.equals(null)

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

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

Но когда "drawable" имеет значение NULL, это означает вызов метода "equals (...)" для нулевого объекта, означает вызов метода для объекта, который не существует, поэтому он генерирует "NullPointerException"

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

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

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

null == null

.

Ответ 7

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

Ответ 8

Используйте google guava libs для обработки is-null-check (обновление deamon)

Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());