Выбор ответа Senior Сеть: Retrofit и OkHttp обновлено
Gson и non-null поля Kotlin
Вопрос
Почему Gson с Kotlin data class может привести к NPE в неожиданном месте?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Gson создаёт объект в обход конструктора и может записать null в non-null поле. Если в классе нет конструктора без аргументов, Gson использует Unsafe.allocateInstance и заполняет поля рефлексией.
Варианты ответа
- Gson не умеет парсить JSON-массивы в
Listи возвращаетnullвместо списка - Gson работает только с Java-классами и пропускает все поля Kotlin
val - Gson создаёт объект в обход конструктора и может записать
nullв non-null полеправильный ответ - Gson возвращает
nullвместо объекта, если в JSON есть хотя бы одно лишнее поле
Разбор
Если в классе нет конструктора без аргументов, Gson использует Unsafe.allocateInstance и заполняет поля рефлексией. Kotlin-проверки null и значения параметров по умолчанию при этом не срабатывают. Отсутствующее поле val name: String окажется null, и NPE случится позже, при обращении. kotlinx.serialization и Moshi с codegen учитывают nullability и дефолты.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.