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.