根据我们的 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)
Run Code Online (Sandbox Code Playgroud)
但我们不确定何时可能真正抛出此异常。该语句的相关代码如下所示:
private val markersMap = mutableMapOf<Any, Marker>()
...
synchronized(markersMap) {
val currentMarkers = markersMap.values.toSet() //it crashes here
// performing some operation on the markers
}
Run Code Online (Sandbox Code Playgroud)
现在我们怀疑多线程会导致这个问题,因为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)))
}
}
Run Code Online (Sandbox Code Playgroud)
基于此,我们假设mapCapacity(size)return …