← Назад к вопросам

Какие знаешь способы проверки на null?

1.3 Junior🔥 251 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверки на null в Kotlin и Java

В контексте Android-разработки работа с null-безопасностью — критически важный аспект для предотвращения NullPointerException (NPE). Kotlin, как основной язык, предлагает встроенные механизмы, но иногда приходится работать и с Java-кодом.

Встроенные средства Kotlin

1. Безопасный вызов (Safe Call) ?.

Позволяет выполнить операцию только если объект не null.

val length: Int? = text?.length // вернёт null если text == null

2. Оператор Элвис (Elvis Operator) ?:

Предоставляет значение по умолчанию при null.

val length: Int = text?.length ?: 0 // вернёт 0 если text или length == null
val result = nullableValue ?: throw IllegalArgumentException("Значение не может быть null")

3. Утверждение ненулевого значения !!

Принудительно разворачивает nullable-тип. Используйте осторожно!

val length: Int = text!!.length // выбросит NPE если text == null

4. Умное приведение (Smart Cast)

Компилятор автоматически приводит тип после проверки.

if (value != null) {
    println(value.length) // value автоматически становится non-null
}

5. Функции let, also, run, apply, takeIf/takeUnless

Позволяют выполнять действия в контексте объекта.

nullableValue?.let { 
    // этот блок выполнится только если nullableValue != null
    processValue(it) 
}

val result = value.takeIf { it.isValid() } ?: defaultValue

Специальные проверки

Проверка на null в коллекциях

val list: List<String?> = listOf("a", null, "c")
val nonNullList = list.filterNotNull() // [a, c]

Работа с nullable Boolean

val bool: Boolean? = null
if (bool == true) { // явная проверка
    // выполнится только если bool точно true
}

Java-подходы (для взаимодействия с legacy-кодом)

Традиционные проверки

if (object != null) {
    object.doSomething();
}

Optional (Java 8+)

Optional.ofNullable(value)
    .map(v -> v.process())
    .orElse(defaultValue);

Аннотации @Nullable/@NotNull

Используются для статического анализа.

public void process(@NotNull String required, @Nullable String optional) {
    // компилятор/IDE предупредит о потенциальных NPE
}

Best Practices для Android

  1. Используйте non-null типы по умолчанию, указывайте nullable только когда это действительно необходимо
  2. Инициализируйте lateinit свойства там, где гарантируете инициализацию до использования
  3. ViewModel/LiveData: используйте Transformations.map или switchMap для null-безопасных преобразований
  4. View Binding/Data Binding: автоматически генерируют non-null поля после инфлейта
  5. Room Database: возвращает nullable типы только для колонок, которые могут быть NULL в БД

Паттерны обработки null

// Паттерн "null object"
interface Logger {
    fun log(message: String)
}

object NullLogger : Logger {
    override fun log(message: String) { /* ничего не делаем */ }
}

val logger: Logger = getLogger() ?: NullLogger

// Сеaled class для явного представления отсутствия значения
sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

Ключевой принцип: старайтесь выявлять потенциальные null как можно раньше — на границах системы (сеть, БД, UI), и использовать non-null типы в бизнес-логике. Kotlin's type system — ваш главный союзник в борьбе с NPE.

Какие знаешь способы проверки на null? | PrepBro