下面的代码在第三行中抛出nullpointer异常。因为objectHashMap为null。但这怎么可能呢。它是一个可以为空的类型,它可以为null。
val objectsGTypeInd = object : GenericTypeIndicator<HashMap<String, Post>>() {}
val objectHashMap: HashMap<String, Post>? = dataSnapshot?.getValue(objectsGTypeInd)
val postList = ArrayList<Post>(objectHashMap?.values)
&#34; collection == null&#34;留言写在logcat
答案 0 :(得分:5)
当您致电ArrayList<Post>(null)
时,您会遇到此问题。如果您的objectHashMap
为空,或者它不包含值,那么您将为空。编译器并没有真正抱怨你有一个null,它抱怨你将它传递给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 */
答案 1 :(得分:3)
问题是objectHashMap?.values
在以下情况下评估为null
objectHashMap
本身为null
或values
属性为null
您正在使用安全运算符?.
,这显然会导致null
结果,您不应将其传递给ArrayList。您可以使用Elvis运算符提供默认值:
ArrayList<Post>(objectHashMap?.values ?: defaultValues)
或者,可以像这样创建一个空列表:
if(objectHashMap==null) ArrayList<Post>() else ArrayList<Post>(objectHashMap.values)
请注意,在第二部分中,编译器允许您将objectHashMap
用作非可空类型,因为您在if
中检查了它。
答案 2 :(得分:1)
Kotlin docs陈述:
b?.length
如果b不为null,则返回b.length,否则返回null。
因此,由于最后ArrayList<Post>(null)
的问号,objectHashMap: HashMap<String, Post>?
属于type nullable,您可能会调用?
。
从我们Kotlin docs about ArrayList Class ArrayList<E>
和你正在使用的Java的constructor开始:
public ArrayList(Collection<? extends E> c)
州:
抛出: NullPointerException - 如果指定的集合为null