Использование null safety в целом предотвращает множество проблем, связанных с NullPointerException. Однако, некорректное его применение или взаимодействие с "небезопасным" кодом (например, на Java) может вызвать трудности:
Взаимодействие с Java-кодом: При вызове Java-кода, который может возвращать null без соответствующих аннотаций (@Nullable, @NonNull), компилятор Kotlin не может гарантировать безопасность. Обращение к таким результатам без проверки на null может привести к NullPointerException в рантайме. Kotlin treats such results as platform types, for which null checks are not enforced at compile time.
kotlin
Использование оператора !! (Not-null assertion operator): Применение !! принудительно преобразует любое значение в ненулевой тип. Если значение фактически null, это приведет к NullPointerException в рантайме. Злоупотребление !! нивелирует преимущества null safety.
kotlin
Неявное приведение типов или использование платформенных типов: При работе с динамическими источниками данных (JSON, XML) или legacy Java-кодом, где типизация может быть нестрогой или отсутствовать null safety, данные могут быть ошибочно интерпретированы как ненулевые. Приведение таких данных к ненулевому типу без должных проверок может вызвать проблемы.
Проблемы при многопоточности: Хотя null safety защищает от NullPointerException вызванного самим компилятором, он не решает проблем, связанных с изменяемым состоянием и конкурентным доступом в многопоточной среде. Переменная, которая изначально не была null, может стать таковой в другом потоке между проверкой на null и использованием, если нет правильной синхронизации.
Использование lateinit или by Delegates.notNull(): Эти механизмы позволяют отложить инициализацию ненулевых свойств. Если доступ к такому свойству происходит до его инициализации, будет выброшен UninitializedPropertyAccessException, что является аналогом NullPointerException для таких случаев.
kotlin