[英]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.