可空类型仍然在 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
:
objectHashMap
本身就是null
或
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
下面这段代码在第三行抛出空指针异常。因为 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
:
objectHashMap
本身就是null
或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