3

次の例で がスローされることに少し驚きましたNullPointerException

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

NullPointerExceptionKotlin コードには 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 Community Edition を使用しています。

4

2 に答える 2

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()、null 許容値が返されることを認識しているため、すべて同じシグネチャを持っていますInt?

これらの注釈のエラーのみが問題を引き起こします。また、JDK ランタイム ライブラリ内に別のバグが見つかった場合は、バグとして追跡する必要があります。

于 2016-01-02T14:18:14.550 に答える