Kotlin · 6 / 6

Null-safety

Nullable-типы, операторы ?. ?: !! и платформенные типы

String и String? различают ненулевое и nullable-значение в системе типов. Это помогает компилятору проверять обычный Kotlin-код, но не исключает все NPE: остаются !!, небезопасная инициализация и границы с Java. Null safety.

Операторы

  • s?.length возвращает null, если получатель null.
  • s ?: "default" вычисляет правую часть только при null слева.
  • s!! требует ненулевое значение и бросает NPE при нарушении.
  • x as? String возвращает null при неудачном приведении.
fun displayName(raw: String?): String =
    raw?.trim()?.takeIf { it.isNotEmpty() } ?: "Guest"

Безопасный вызов защищает именно nullable-получателя; тело вызванного метода всё ещё может бросить собственное исключение. Операторы null safety.

Smart cast

После проверки компилятор сужает тип, только если может доказать неизменность значения между проверкой и использованием. Для локальной var это зависит от её изменений и захвата замыканием; для var-свойства обычный smart cast недоступен. Можно прочитать свойство один раз в локальную val. Условия smart cast.

Платформенные типы

Java-значение с неизвестной nullability может иметь платформенный тип, отображаемый IDE как String!; в исходном Kotlin так тип не записывают. Его можно использовать как nullable или ненулевой тип, но второй выбор может добавить runtime-проверку и привести к исключению, если Java вернула null. Обработайте неопределённость на границе. Java interop.

lateinit

lateinit var откладывает инициализацию ненулевого непримитивного свойства. Чтение до записи бросает UninitializedPropertyAccessException; ::prop.isInitialized доступен не произвольно извне, а там, где доступно backing field. lateinit var count: Int не разрешён. Properties.

К вопросам →