当前位置: 首页 > 知识库问答 >
问题:

智能强制转换为“位图!”这是不可能的,因为“Bitmap1”是一个可变属性,此时可能已被更改

胡野
2023-03-14
     bitmap1 = Bitmap.createScaledBitmap(

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

        (width.toInt()),

        (height.toInt()),

        false)

    numberOfInvaders ++

我还在另一个类中使用了bitmap2和Bitmap1:

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

这里写着:类型不匹配,必需:位图找到:位图?

共有1个答案

段干华晖
2023-03-14

是的,这是正确的:)您不能这样使用值,因为它在某些时候可能是空的。

CreateScaledBitmap需要不可为null的bitmap,但不能保证您使用的位图在调用给定函数时不会为null。

那么,你能做什么?在呼叫检查位图是否为空之前:

if (bitmap != null) { /* code here, still requires !! operator */ }

在多线程环境中,存在这样的风险:在代码块的执行过程中,值仍然会发生更改,因此您可以使用let函数和?.运算符(与.运算符基本相同,但仅在value不为null时执行)。块代码将使用一个实际上是最后的参数来调用,该参数是用于调用此方法的实例,在本例中为“位图”,称为“上下文对象”,可通过it关键字访问:

bitmap?.let { /* code here, bitmap is passed as effectively final, so for sure it's not null  */ }

另一种方法是!!运算符(但如果值为null,它可以以NPE异常结束)。只有当您确定此时该值不会为空时才使用,否则您可能会使应用程序崩溃。

此外,还可以使用?:运算符-如果不是null,则取第一个值,否则取第二个值。这是非常好的,因为您可以使用例如默认值。此外,您还可以在那里抛出异常;)

bitmap ?: throw IllegalStateException("bitmap is null") // exception
bitmap ?: DEFAULT_BITMAP // default bitmap, if any

在这种情况下,您将得到异常,但具有非常可沟通的消息(而不仅仅是NPE)。

 类似资料: