Java 在包含空值的ArrayList上使用映射{}时的NPE
我要走了 java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的“float java.lang.Number.floatValue()” 关于以下代码:Java 在包含空值的ArrayList上使用映射{}时的NPE,java,dictionary,kotlin,nullpointerexception,null,Java,Dictionary,Kotlin,Nullpointerexception,Null,我要走了 java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的“float java.lang.Number.floatValue()” 关于以下代码: val localHistory: ArrayList<Float> = ArrayList<Float>() ... val strHistory = localHistory.map { value -> decoration.decoratedValue(re
val localHistory: ArrayList<Float> = ArrayList<Float>()
...
val strHistory = localHistory.map { value -> decoration.decoratedValue(ref.format, value) }
val localHistory:ArrayList=ArrayList()
...
val strHistory=localHistory.map{value->decoration.decoratedValue(ref.format,value)}
我刚刚了解到ArrayList可能包含null(oook)。这意味着映射转换闭包中的值可能为NULL,不是吗
但这不可能,因为该值不是可选类型,并且编译器说if(value!=null)将始终为true
所以问题是在这种情况下如何避免NPE 如果只想排除
ArrayList
中的空值,请调用mapNotNull
而不是map
。有关详细信息,请参阅
然后,您还需要处理lambda中值为null的情况,您可以使用
localHistory.mapNotNull { value -> value?.let { decoration.decoratedValue(ref.format, it) } }
我建议将您从Java收到的集合中的每个参数标记为可空(当然,除非您知道永远不能为null
:
val floats: List<Float?> = someJavaClass.getFloats()
val newFloats: List<Float> = floats
.mapNotNull { it?.plus(1) }
请记住,每个过滤器
、映射
(等等)操作都会迭代整个集合,并在每次都创建一个新集合。最好使用延迟迭代的序列
如注释中所述,可以使用filterNotNull
直接过滤掉所有空值:
val newFloats: List<Float> = floats
.filterNotNull()
.map { it + 1 }
我能想到的另一个结构适用于您的示例,尽管它非常不可读且非常复杂。但它是:
val strHistory = localHistory
.mapNotNull { decoration.decoratedValue(ref.format, it ?: return@mapNotNull null) }
还有一个mapNotNull:
val strHistory = localHistory.mapNotNull { it ?: return@mapNotNull null
decoration.decoratedValue(ref.format, it) }
你是如何填写ArrayList
?你是用kotlin还是java?好问题。它实际上是由GSON反序列化的,所以应该是java。当然,列表可以包含null
。在这种情况下,自动取消装箱将失败(从Float
转换为Float
)这显然是在这里完成的。一旦自动取消装箱成功,变量值
(这显然是一个基本的浮点值
)不能再是null
了。Json可以包含任何null
值吗?如果是,请将从java获得的集合标记为ArrayList
,然后过滤掉可能的null
值。我有什么选项可以防止失败?我得到了编译器的建议,当我尝试使用mapNotNullCh时,这是不必要的将声明更改为ArrayList
,告诉编译器列表可能包含空条目。另外请注意,您可以使用filterNotNull()
而不是filter{it!=null}
。
val strHistory = localHistory.mapNotNull { it ?: return@mapNotNull null
decoration.decoratedValue(ref.format, it) }