Почему Kotlin принимает нулевое значение в атрибуте, объявленном как ненулевая строка? - PullRequest
5 голосов
/ 22 января 2020

Я объявил data class следующим образом:

data class Product(val name: String = "", val price: Float = 0f)

Мой код:

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

Вывод на консоль: name is null

Как это возможно? Атрибут name не является пустой строкой.

1 Ответ

7 голосов
/ 22 января 2020

Это обычная проблема при использовании Gson с Kotlin - и ошибки времени выполнения здесь возникают слишком поздно, что может сделать вашу программу нестабильной и без * cra sh дружественной. Например, напишите:

val name: String = p.name

Бум! Cra sh.

Gson просто, согласно супер хакерской реализации , выделяет память для класса без вызова конструктора, а затем заполняет поля значениями, присутствующими в JSON, используя отражение.

Это позволяет хранить null в ненулевых свойствах Kotlin, что может вызвать NPE во время выполнения. Вы можете предоставить пользовательский TypeAdapter для отключения отражения для вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...