可空类型仍然在 Kotlin 中抛出空指针异常

Nullable type still throw nullpointer exception at Kotlin

下面这段代码在第三行抛出空指针异常。因为 objectHashMap 为空。但这怎么可能。它是可空类型,可以为空。

val objectsGTypeInd = object : GenericTypeIndicator<HashMap<String, Post>>() {}
val objectHashMap: HashMap<String, Post>? = dataSnapshot?.getValue(objectsGTypeInd)
val postList = ArrayList<Post>(objectHashMap?.values)

"collection == null" 消息写入 logcat

当您调用 ArrayList<Post>(null) 时,您会遇到这个问题。如果您的 objectHashMap 为空,或者它不包含任何值,那么您将在那里有一个空值。编译器并没有真正抱怨你有一个空值,它抱怨的是你将它传递给 ArrayList() 构造函数。

如果您查看 ArrayList 的 JavaDoc,它指出集合不能为空,否则您将得到 NullPointerException:

/**
 * Constructs a list containing the elements of the specified
 * collection, in the order they are returned by the collection's
 * iterator.
 *
 * @param c the collection whose elements are to be placed into this list
 * @throws NullPointerException if the specified collection is null
 */

问题是 objectHashMap?.values 在以下情况下的计算结果为 null

  1. objectHashMap本身就是null
  2. values 属性 是 null

您正在使用安全运算符 ?.,这显然会导致 null 结果,您不应将其传递给 ArrayList。您可以使用 Elvis 运算符提供默认值:

ArrayList<Post>(objectHashMap?.values ?: defaultValues)

或者,可以像这样创建一个空列表:

if(objectHashMap==null) ArrayList<Post>() else ArrayList<Post>(objectHashMap.values)

请注意,在第二部分中,编译器允许您使用 objectHashMap 作为不可空类型,因为您在 if.

中检查了它

Kotlin 文档状态:

b?.length

This returns b.length if b is not null, and null otherwise.

因此,由于 ?.

末尾的问号,objectHashMap: HashMap<String, Post>? 属于 type nullable,因此您可能正在调用 ArrayList<Post>(null)

来自您正在使用的Kotlin docs about ArrayList, which link us to Java Class ArrayList<E> and the constructor

public ArrayList(Collection<? extends E> c) 状态:

Throws: NullPointerException - if the specified collection is null