Null safety — это система защиты от ошибок, связанных с попыткой доступа к null
-значениям (NullPointerException, NPE). Это фундаментальная концепция в современных языках программирования, особенно в Kotlin, где она реализована на уровне системы типов.
В Java (до версии 8 с Optional) любая переменная объекта может быть null
, что приводит к частым ошибкам:
String text = null;
text.length(); // Выбросит NullPointerException
null
(по умолчанию).?
и может содержать null
.val nonNullable: String = "Hello" // Не может быть null
val nullable: String? = null // Может быть null
Kotlin предоставляет инструменты для работы с nullable-типами:
a. Safe call operator (?.
)
Выполняет операцию только если объект не null
:
val length: Int? = nullableString?.length // Вернет null если nullableString == null
b. Elvis operator (?:
)
Предоставляет значение по умолчанию:
val length: Int = nullableString?.length ?: 0 // Вернет 0 если null
c. Not-null assertion (!!
)
Принудительное приведение (опасно, может вызвать NPE):
val length: Int = nullableString!!.length // Выбросит NPE если null
d. Safe cast (as?
)
Безопасное приведение типов:
val intValue: Int? = value as? Int // Вернет null если приведение невозможно
val list: List<Int?> = listOf(1, 2, null, 4)
val nonNullList: List<Int> = list.filterNotNull() // [1, 2, 4]
1. Обработка View в Fragment:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Безопасный доступ к View после onViewCreated
view.findViewById<TextView>(R.id.text_view)?.text = "Hello"
}
2. Парсинг данных из API:
data class User(val name: String, val age: Int?)
fun parseUser(json: String): User? {
return try {
// Возвращаем null при ошибке парсинга
Json.decodeFromString(json)
} catch (e: Exception) {
null
}
}
✅ Предотвращение NPE: Ошибки обнаруживаются на этапе компиляции.
✅ Читаемость кода: Явное обозначение nullable-типов.
✅ Безопасность: Снижение количества runtime-ошибок.
@Nullable/@NonNull
).var
):
lateinit var lateInitialized: String
Type!
(nullable или нет неизвестно).Null safety в Kotlin — это мощная система типов, которая минимизирует ошибки доступа к null-значениям через комбинацию nullable-типов, операторов безопасного доступа и проверок на этапе компиляции. Это одна из ключевых причин, почему Kotlin считается более безопасным языком для Android-разработки по сравнению с Java.