NullPointerException при переходе от непустого Iterable к массиву - PullRequest
0 голосов
/ 26 апреля 2020

Я получаю исключение NullPointerException, когда пытаюсь преобразовать Iterable в Array, зная, что он заполнен данными.

Код будет говорить более кратко, чем я могу.

В моем случае тип c общего типа A представляет собой Array[Double]


def ex1[A](it: Iterable[A])(implicit ct: ClassTag[A]): Array[A] = {
  // Check if each element is defined
  it.forall(Option(_).isDefined) // return true
  // Problem is comming
  it.toArray(ct) // NullPointerException
}

def ex2[A](it: Iterable[A])(implicit ct: ClassTag[A]): Array[A] = {
  Array[A](it.toSeq:_*)(ct) // NullPointerException
}

Этот Iterable является результатом groupBy, где я преобразую Array[A] в Iterable[A] вот так


def ex3[A : ClassTag](ar: Array[A]): Map[Int, Iterable[A]] = {
  ar.map((Random.nextInt(2), _)).groupBy(_._1).map{ case (k, values) => (k, values.map(_._2).toIterable) }

Версия scala - 2.12.10.

Вот вот stackTrace

[error] (run-main-6) java.lang.NullPointerException
[error] java.lang.NullPointerException
[error]     at scala.collection.TraversableOnce.toArray(TraversableOnce.scala:290)
[error]     at scala.collection.TraversableOnce.toArray$(TraversableOnce.scala:288)
[error]     at scala.collection.AbstractTraversable.toArray(Traversable.scala:108)
[error]     at xxx.yyy.problem where i'm doing the `toArray`
[error]     at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
[error]     at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error]     at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error]     at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error]     at scala.collection.TraversableLike.map(TraversableLike.scala:238)
[error]     at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
[error]     at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)

Файл TraversableOnce указывает строку Array создания следующим образом:


  def toArray[B >: A : ClassTag]: Array[B] = {
    if (isTraversableAgain) {
      val result = new Array[B](size) // TraversableOnce.scala:290
      copyToArray(result, 0)
      result
    }
    else toBuffer.toArray
  }

Проблема возникает, когда я вызываю toArray в Iterable[V] из Array[K, Iterable[V]]. Он генерируется следующим образом:

def groupByKey[K : ClassTag, V : ClassTag](arr: Array[(K, V)]): Array[(K, Iterable[V])] = {
    arr.groupBy(_._1).toArray.map{ case (k, agg) =>
      val works: Iterable[V] = agg.toIterable.map(_._2)
      val notWorks: Array[V] = agg.map(_._2)
      val notWorksToo: Array[V] = works.toArray
      val it = works
      (k, it)
    }
  }

Вот здесь stackTrace для строки notWorks

[error] java.lang.NullPointerException
[error]         at scala.collection.mutable.ArrayBuilder$.make(ArrayBuilder.scala:40)
[error]         at scala.Array$$anon$2.apply(Array.scala:66)
[error]         at scala.Array$$anon$2.apply(Array.scala:65)
[error]     at scala.collection.TraversableLike.builder$1(TraversableLike.scala:233)
[error]     at scala.collection.TraversableLike.map(TraversableLike.scala:237)
[error]     at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
[error]     at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
[error]     at xxx.yyy.problem at notWorks line
[error]     at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
[error]     at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error]     at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error]     at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error]     at scala.collection.TraversableLike.map(TraversableLike.scala:238)
[error]     at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
[error]     at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...