Nullable类型仍然在Kotlin抛出nullpointer异常

时间:2018-05-19 16:48:46

标签: nullpointerexception kotlin null-pointer

下面的代码在第三行中抛出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

3 个答案:

答案 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

  1. objectHashMap本身为null
  2. values属性为null
  3. 您正在使用安全运算符?.,这显然会导致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>和你正在使用的Javaconstructor开始:

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

  

抛出:   NullPointerException - 如果指定的集合为null