[英]Unboxing of hashmap.get() is producing a NullPointerException
[英]Why does HashMap.get not return a nullable type?
我有点惊讶,以下示例抛出NullPointerException
:
fun main(args: Array<String>) {
val hm = HashMap<String, Int>()
hm.put("alice", 42)
val x = hm.get("bob")
println(x) // BOOM
}
我以为Kotlin代码中没有NullPointerException
?
如果我用可选类型注释x
,则程序打印为null
:
fun main(args: Array<String>) {
val hm = HashMap<String, Int>()
hm.put("alice", 42)
val x: Int? = hm.get("bob")
println(x) // null
}
我是否发现了一个特例,或者这是Kotlin / Java互操作的一般问题?
我正在使用带有Kotlin 0.11.91.1插件的IntelliJ IDEA 14.1社区版。
你的变量hm
是HashMap
类型,因为它是一个平台类,它的方法返回平台类型 。 然而,Kotlin自己的Map
及其子
特性
子接口MutableMap
为get()
返回可为空的类型。
将您的代码更改为
val hm : MutableMap<String, Int> = HashMap()
它将打印“null”。
这不再是一个问题。 Kotlin对如何注释JDK类有一个问题,告诉它如何处理一些方法。 目前Kotlin没有出现您所看到的问题。
这些都从Java集合返回HashMap,第一个hm1
更加惯用。
val hm1 = hashMapOf<String, Int>()
val hm2 = HashMap<String, Int>()
您也可以将其创建为已经具有值的地图(如果提前知道它们)。
val hm3 = hashMapOf("alice" to 42)
或只读版本:
val hm4 = mapOf("alice" to 42)
在所有这些版本中,当调用具有未知值的get()
然后打印结果时,它们都打印为null
:
println(hm1.get("missing"))
println(hm2.get("missing"))
println(hm3.get("missing"))
println(hm4.get("missing"))
所有都具有相同的get()
签名,因为Kotlin团队注释了JDK类,知道get()
返回一个可以为空的值Int?
在这种情况下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.