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

Приведи пример проверки на null

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

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

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

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

Примеры проверки на null в Kotlin (для Android/Kotlin-разработчика)

1. Базовые подходы с оператором безопасного вызова (?.)

Самый распространённый способ в Kotlin — использовать оператор безопасного вызова (safe call operator), который возвращает null, если объект равен null:

// Безопасный вызов метода
val user: User? = getUser()
val userName: String? = user?.name // userName будет null, если user равен null

// Цепочка безопасных вызовов
val street: String? = user?.address?.street?.uppercase()

2. Оператор Элвиса (?:) для значения по умолчанию

Оператор Элвиса (Elvis operator) позволяет указать значение по умолчанию при null:

// Значение по умолчанию
val displayName: String = user?.name ?: "Гость"

// Более сложный пример с вычислением
val orderTotal: Double = calculateTotal() ?: 0.0

// Можно выполнять действие при null
val connection: Connection? = getConnection()
connection?.connect() ?: throw ConnectionException("Нет соединения")

3. Явная проверка с if-else и return

Для явного управления потоком выполнения при null значениях:

fun processUser(user: User?) {
    if (user == null) {
        Log.w("User", "Пользователь не найден")
        return
    }
    
    // После проверки компилятор Smart Cast автоматически приводит к non-null типу
    println(user.name) // user здесь уже User, а не User?
}

// Альтернативный вариант с ранним возвратом
fun getUserEmail(user: User?): String {
    val email = user?.email
    if (email.isNullOrEmpty()) {
        return "no-email@example.com"
    }
    return email
}

4. Оператор !! (not-null assertion) — с осторожностью!

Оператор !! преобразует nullable-тип в non-null, но бросает NullPointerException если значение равно null:

// ОПАСНО: может вызвать NullPointerException
val dangerousName: String = user!!.name

// Применять только когда уверены на 100%
val context: Context = requireContext() // часто используется в Fragment

5. Проверки для коллекций и строк

Kotlin предоставляет специальные функции для работы с nullable коллекциями и строками:

// Для строк
val text: String? = null
if (text.isNullOrEmpty()) {
    // Обработка null или пустой строки
}

// Для коллекций
val list: List<String>? = getList()
val size = list?.size ?: 0
val firstItem = list?.firstOrNull()

// let, also, run, with, apply scope-функции
user?.let { 
    // Блок выполнится только если user не null
    updateProfile(it.name)
    logUserActivity(it.id)
}

6. Практический пример из Android-разработки

В реальных Android-приложениях проверка на null встречается повсеместно:

class UserProfileFragment : Fragment() {
    private var binding: FragmentUserProfileBinding? = null
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding = FragmentUserProfileBinding.bind(view)
        
        // Используем let для безопасной работы с binding
        binding?.let { b ->
            b.userName.text = viewModel.userName ?: "Неизвестный пользователь"
            b.loadingIndicator.visibility = View.GONE
            
            // Обработка кликов с проверкой на null
            b.logoutButton.setOnClickListener {
                viewModel.logout()
            }
        }
    }
    
    override fun onDestroyView() {
        // Важно занулять binding во избежание утечек памяти
        binding = null
        super.onDestroyView()
    }
    
    // Безопасное получение аргументов
    private fun getUserId(): String {
        return arguments?.getString(ARG_USER_ID) 
            ?: throw IllegalStateException("User ID не передан")
    }
}

7. Рекомендации по использованию

  • Предпочитайте ?. и ?: явным проверкам с if, когда возможно
  • Используйте let/also для выполнения блока кода только при non-null значениях
  • Избегайте !! в production коде — это антипаттерн
  • Локализуйте nullability — старайтесь, чтобы nullable значения не распространялись по всей кодовой базе
  • Используйте Smart Cast Kotlin, который автоматически преобразует типы после проверок

Правильная работа с nullable типами — одна из ключевых особенностей Kotlin, которая значительно повышает безопасность кода по сравнению с Java, где NullPointerException является одной из самых частых ошибок времени выполнения.