根据我们的Crashlytics日志,似乎我们偶尔会遇到以下异常:
基于此,我们可以假设
有人知道在这里返回
Fatal Exception: java.lang.IllegalArgumentException
Illegal initial capacity: -1
...
java.util.HashMap.<init> (HashMap.java:448)
java.util.LinkedHashMap.<init> (LinkedHashMap.java:371)
java.util.HashSet.<init> (HashSet.java:161)
java.util.LinkedHashSet.<init> (LinkedHashSet.java:146)
kotlin.collections.CollectionsKt___CollectionsKt.toSet (CollectionsKt___CollectionsKt.java:1316)
但我们不确定这个异常实际上是在什么时候抛出的。该语句相关的代码大致如下:
private val markersMap = mutableMapOf<Any, Marker>()
...
synchronized(markersMap) {
val currentMarkers = markersMap.values.toSet() //it crashes here
// performing some operation on the markers
}
目前我们怀疑多线程引起了这个问题,因为markersMap
被在多个地方修改,但是由于该映射表已通过默认方式初始化,所以我们不确定它会变为空状态以下。我们还查看了toSet
的实现:
if (this is Collection) {
return when (size) {
0 -> emptySet()
1 -> setOf(if (this is List) this[0] else iterator().next())
else -> toCollection(LinkedHashSet<T>(mapCapacity(size)))
}
}
基于此,我们可以假设
mapCapacity(size)
返回 -1
,但我们无法找到 mapCapacity
的实际实现来验证什么情况会发生这种情况。有人知道在这里返回
-1
是什么时候,从而导致构造函数失败吗?