Умное приведение к «Растровому!» невозможно, потому что 'bitmap1' является изменяемым свойством, которое могло быть изменено к этому времени - PullRequest
0 голосов
/ 11 января 2020
     bitmap1 = Bitmap.createScaledBitmap(

        bitmap1, // <---- error is  here 

        (width.toInt()),

        (height.toInt()),

        false)

    numberOfInvaders ++

Я также использовал bitmap2 и bitmap 1 в другом классе:

                 if (uhOrOh) {
                    canvas.drawBitmap(Invader.bitmap1, // <--- error is here 
                        invader.position.left,
                        invader.position.top,
                        paint)
                } else {
                    canvas.drawBitmap(Invader.bitmap2, // <---- and here
                        invader.position.left,
                        invader.position.top,
                        paint)
                }

здесь написано: Несоответствие типов, Обязательное: Bitmap Found: Bitmap?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Да, это правда :) Вы не можете использовать значение, подобное этому, потому что в какой-то момент оно может быть нулевым.

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).

0 голосов
/ 11 января 2020
    bitmap1 = Bitmap.createScaledBitmap(

    bitmap1!!, // !! <--- helps

    (width.toInt()),

    (height.toInt()),

    false)

numberOfInvaders ++



            if (uhOrOh) {
                canvas.drawBitmap(Invader.bitmap1!!, //  here 
                    invader.position.left,
                    invader.position.top,
                    paint)
            } else {
                canvas.drawBitmap(Invader.bitmap2!!, //  and here too
                    invader.position.left,
                    invader.position.top,
                    paint)
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...