小编Flo*_*ner的帖子

什么情况下toSet可以抛出java.lang.IllegalArgumentException?

根据我们的 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 …

java android kotlin

3
推荐指数
1
解决办法
55
查看次数

标签 统计

android ×1

java ×1

kotlin ×1