4. Понятие обнуляемости
В этом задании вы узнаете о переменных, допускающих значение null, и переменных, не допускающих значение null. Ошибки программирования, связанные со значением null, стали причиной бесчисленных багов. Kotlin стремится уменьшить количество багов, вводя переменные, не допускающие значение null.
Шаг 1: Изучите понятие нулевую возможность
По умолчанию переменные не могут быть пустыми null.
- Объявите переменную
Intи присвойтеnullей значение.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
- Используйте вопросительный знак
?после типа, чтобы указать, что переменная может быть равна null. Объявите переменнуюInt?и присвойтеnullей значение.
var marbles: Int? = null
Когда у вас сложные типы данных, например, список:
- Вы можете разрешить элементам списка быть пустыми (null).
- Вы можете разрешить списку принимать значения null, но если он не равен null, его элементы не могут быть null.
- Вы можете разрешить как самому списку, так и его элементам быть пустыми.
Списки и некоторые другие сложные типы данных будут рассмотрены в последующем задании.
Шаг 2: Изучите операторы ? и ?:
Вы можете проверить это nullс помощью ?оператора, что избавит вас от необходимости писать множество операторов if/ else.
- Напишите более длинный код для проверки того,
fishFoodTreatsне является ли переменная пустойnull. Затем уменьшите значение этой переменной.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
fishFoodTreats = fishFoodTreats.dec()
}
- Теперь рассмотрим, как это написано на Kotlin с использованием
?оператора.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
- Также можно объединять проверки на null с помощью
?:оператора. Посмотрите на этот пример:
fishFoodTreats = fishFoodTreats?.dec() ?: 0
Это сокращенная запись для выражения «если fishFoodTreatsне равно null, уменьшите значение и используйте его; в противном случае используйте значение после ?:, которое равно 0». Если fishFoodTreatsравно null, вычисление останавливается, и dec()метод не вызывается.
Замечание о нулевых указателях
Если вам действительно нравятся значения NullPointerExceptionsтипа `null`, Kotlin позволяет их сохранить. Оператор проверки на ненулевое значение !!(двойной восклицательный знак) преобразует любое значение в ненулевой тип и генерирует исключение, если значение равно `null` null.
val len = s!!.length // throws NullPointerException if s is null