Выбор ответа Senior Сеть: Retrofit и OkHttp обновлено

Gson и non-null поля Kotlin

Вопрос

Почему Gson с Kotlin data class может привести к NPE в неожиданном месте?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Gson создаёт объект в обход конструктора и может записать null в non-null поле. Если в классе нет конструктора без аргументов, Gson использует Unsafe.allocateInstance и заполняет поля рефлексией.

Варианты ответа

  1. Gson не умеет парсить JSON-массивы в List и возвращает null вместо списка
  2. Gson работает только с Java-классами и пропускает все поля Kotlin val
  3. Gson создаёт объект в обход конструктора и может записать null в non-null полеправильный ответ
  4. Gson возвращает null вместо объекта, если в JSON есть хотя бы одно лишнее поле

Разбор

Если в классе нет конструктора без аргументов, Gson использует Unsafe.allocateInstance и заполняет поля рефлексией. Kotlin-проверки null и значения параметров по умолчанию при этом не срабатывают. Отсутствующее поле val name: String окажется null, и NPE случится позже, при обращении. kotlinx.serialization и Moshi с codegen учитывают nullability и дефолты.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.