3

我有点惊讶以下示例抛出NullPointerException

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x = hm.get("bob")
    println(x)   // BOOM
}

NullPointerException我以为Kotlin 代码中没有s ?

如果我使用可选类型进行注释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 社区版。

4

2 回答 2

6

您的变量hm是类型HashMap,因为这是一个平台类,它的方法返回平台类型。然而, Kotlin 自己Map及其subtrait子接口MutableMapget().

将您的代码更改为

val hm : MutableMap<String, Int> = HashMap()

它将打印“null”。

于 2015-04-19T19:07:35.220 回答
0

这不再是一个问题。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)

在所有这些版本中,它们都在使用未知值null调用get()然后打印结果时打印:

println(hm1.get("missing"))
println(hm2.get("missing"))
println(hm3.get("missing"))
println(hm4.get("missing"))

get()因为 JDK 类由 Kotlin 团队注释,所以它们都具有相同的签名,以知道在这种情况下get()返回一个可为空的值。Int?

只有这些注释中的错误会导致问题。如果您在 JDK 运行时库中看到另一个错误,则应将其作为错误进行跟踪。

于 2016-01-02T14:18:14.550 回答