Я получаю исключение 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)