Обнуляемый тип все еще генерирует исключение nullpointer в Kotlin - PullRequest
0 голосов
/ 19 мая 2018

Этот код ниже выдает исключение нулевого указателя в третьей строке.Потому что objectHashMap имеет значение null.Но как это возможно?Это обнуляемый тип, и он может быть нулевым.

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

Запись сообщения "collection == null" в logcat

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Проблема в том, что objectHashMap?.values оценивается как null, когда:

  1. objectHashMap само по себе null или
  2. values свойство равно null

Вы используете безопасный оператор ?., и это, очевидно, может привести к null результатам, которые вы не должны передавать ArrayList.Вы можете указать значение по умолчанию, используя оператор Элвиса:

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

В качестве альтернативы можно создать пустой список следующим образом:

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

Обратите внимание, что во второй части компилятор позволяетвы используете objectHashMap как необнуляемый тип, так как вы проверили его в if.

0 голосов
/ 19 мая 2018

Состояние документов Kotlin:

b?.length

Возвращает b.length, если b не ноль, и ноль в противном случае.

Таким образом, вы, возможно, звоните ArrayList<Post>(null), поскольку objectHashMap: HashMap<String, Post>? имеет тип , может быть обнуляем из-за вопросительного знака в конце ?.

Из документов Kotlin об ArrayList , которые связывают нас с Java Class ArrayList<E> и конструктором , который вы используете:

public ArrayList(Collection<? extends E> c)состояния:

Броски: NullPointerException - если указанная коллекция является нулем

0 голосов
/ 19 мая 2018

Когда вы позвоните ArrayList<Post>(null), вы получите эту проблему.Если ваш objectHashMap равен нулю или не содержит значений, у вас там будет ноль.Компилятор на самом деле не жалуется на то, что у вас есть нулевое значение, он жалуется на то, что вы передаете его конструктору ArrayList().

Если вы посмотрите на JavaDoc для ArrayList, он утверждает, чточто коллекция не может быть нулевой, или вы получите 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
 */
...