为什么 Kotlin 在声明为不可为空字符串的属性中接受空值?

Vin*_*ade 5 java android gson kotlin

我这样声明data class

data class Product(val name: String = "", val price: Float = 0f)
Run Code Online (Sandbox Code Playgroud)

我的代码是:

val json = "{'name': null, 'price': 50.00}"
val gson = GsonBuilder().create()
val p = gson.fromJson(json, Product::class.java)
println("name is ${p.name}")
Run Code Online (Sandbox Code Playgroud)

控制台输出是: name is null

这怎么可能?name 属性不是可为空的字符串。

xin*_*aiz 7

这是在 Kotlin 中使用 Gson 时的常见问题 - 运行时错误在这里发生得太晚了,这可能会使您的程序不稳定且容易崩溃。例如,写:

val name: String = p.name

繁荣!碰撞。

Gson 只是按照super hacky implementation,在不调用构造函数的情况下为类分配内存,然后使用反射用 JSON 中存在的值填充字段。

这使得可以存储null在 Kotlin 的非空属性中,这可能会在运行时导致 NPE。您可以提供自定义TypeAdapter来禁用您的类的反射。