Да, это правда :) Вы не можете использовать значение, подобное этому, потому что в какой-то момент оно может быть нулевым.
createScaledBitmap
требует ненулевого значения Bitmap
, но нет никакой гарантии, что растровое изображение, которое вы используете, выиграло не будет нулевым в момент вызова данной функции.
Итак, что вы можете сделать? Перед вызовом проверьте, не является ли битовое изображение ненулевым:
if (bitmap != null) { /* code here, still requires !! operator */ }
В многопоточной среде существует риск того, что во время выполнения блока кода значение все равно изменится, поэтому вы можете использовать функцию let
с ?.
оператор (в основном тот же оператор, что и .
, но выполняется только если значение не равно нулю). Код блока будет вызываться с действительно окончательным аргументом, который является экземпляром, который вы используете для вызова этого метода, в данном случае «растровое изображение», называемое «контекстный объект», доступное через ключевое слово it
:
bitmap?.let { /* code here, bitmap is passed as effectively final, so for sure it's not null */ }
Другим способом будет оператор !!
(но он может завершиться sh с исключением NPE, если значение равно нулю). Используйте только в том случае, если вы уверены, что это значение в этот момент не будет нулевым, в противном случае вы можете обработать sh ваше приложение.
Кроме того, вы можете использовать оператор ?:
- это будет первое значение, если не нуль, иначе второе. Это довольно приятно, потому что вы можете использовать, например, значение по умолчанию. Также вы можете выбросить туда исключение;)
bitmap ?: throw IllegalStateException("bitmap is null") // exception
bitmap ?: DEFAULT_BITMAP // default bitmap, if any
В этом случае вы получите исключение, но с очень коммуникативным сообщением (вместо просто NPE).