Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在包含空值的ArrayList上使用映射{}时的NPE_Java_Dictionary_Kotlin_Nullpointerexception_Null - Fatal编程技术网

Java 在包含空值的ArrayList上使用映射{}时的NPE

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

我要走了

java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的“float java.lang.Number.floatValue()”

关于以下代码:

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) }