Я создаю приложение, которое извлекает изображения из Интернета. В случае, если изображение не может быть получено, следует использовать другое локальное изображение.
При попытке выполнить следующие строки:
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
drawable = getRandomDrawable();
}
Строка if (drawable.equals (null)) выдает исключение, если drawable равно null.
Кто-нибудь знает, как следует проверять значение drawable, чтобы не генерировать исключение, если оно равно нулю, и получить локальное изображение (выполнить drawable = getRandomDrawable ())?
Ответы:
Отредактированное решение Java 8:
final Drawable drawable = Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath())) .orElseGet(() -> getRandomDrawable());
Вы можете заявить
drawable
final
в этом случае.Как отметил Часмо, Android на данный момент не поддерживает Java 8. Так что это решение возможно только в другом контексте.
источник
Common
класс и позволил бы вам указать резервный URL-адрес, сохранив обязанности вместе.Optional.of
подразумевается, что значение не равно нулю, и поэтому в нем нетorElseGet
необходимости. Вы должны использоватьOptional.ofNullable
в этом случае.Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (drawable == null) { drawable = getRandomDrawable(); }
В
equals()
методе проверяет значение равенства, что означает , что он сравнивает содержимое двух объектов. Посколькуnull
это не объект, происходит сбой при попытке сравнить содержимое вашего объекта с содержимымnull
.В
==
оператор проверяет эталонным равенства, что означает , что она выглядит ли два объекта на самом деле тот же объект . Это не требует, чтобы объекты действительно существовали; два несуществующих объекта (null
ссылки) также равны.источник
Я использую такой подход:
if (null == drawable) { //do stuff } else { //other things }
Этот способ улучшает читаемость строки - когда я быстро просматриваю исходный файл, я вижу, что это проверка на ноль.
Что касается того, почему вы не можете вызвать
.equals()
объект, который может бытьnull
; если ссылка на объект у вас есть (а именно «рисуем») является на самом делеnull
, это не указывает на объект в куче. Это означает, что в куче нет объекта, вызов которого мог быequals()
быть успешным.Удачи!
источник
Сделай сам
private boolean isNull(Object obj) { return obj == null; }
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath()); if (isNull(drawable)) { drawable = getRandomDrawable(); }
источник
drawable.equals(null)
Вышеупомянутая строка вызывает метод «equals (...)» для рисованного объекта.
Итак, когда drawable не равно null и это реальный объект, тогда все идет хорошо, так как вызов метода equals (null) вернет false
Но когда «drawable» имеет значение null, это означает вызов метода «equals (...)» для нулевого объекта, означает вызов метода для объекта, который не существует, поэтому он вызывает «NullPointerException»
Чтобы проверить, существует ли объект и не является ли он нулевым, используйте следующее
if(drawable == null) { ... ... }
В приведенном выше условии мы проверяем, что ссылочная переменная "drawable" имеет значение NULL или содержит некоторое значение (ссылку на ее объект), поэтому она не будет генерировать исключение в случае, если значение drawable равно NULL, как проверка
null == null
является действительным.
источник
if (yourObject instanceof yourClassName)
оценим,false
еслиyourObject
естьnull
.источник
Вероятно, немного эффективнее поймать исключение NullPointerException. Вышеупомянутые методы означают, что среда выполнения дважды проверяет наличие нулевых указателей.
источник
if x == null
?Используйте библиотеки google guava для обработки is-null-check (обновление deamon)
Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());
источник
Optional
сегодня.Просто чтобы дать некоторые идеи разработчику исходного кода Oracle Java :-)
Решение уже существует в .Net и более читабельно!
В Visual Basic .Net
Drawable drawable = If(Common.getDrawableFromUrl(this, product.getMapPath()) ,getRandomDrawable() )
В C #
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath() ?? getRandomDrawable();
Эти решения эффективны как необязательное решение Java (строка по умолчанию оценивается только в том случае, если исходное значение равно нулю) без использования лямбда-выражения, просто путем добавления нового оператора.
Чтобы быстро увидеть разницу с решением Java, я добавил 2 решения Java.
Использование Optional в 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 ... а вы?источник