Если вы занимаетесь разработкой Android с использованием Java даже в течение нескольких месяцев, вы должны знать, насколько правдива приведенная выше цитата и разочаровывает NullPointerException.

Для тех, кто не знает, NullPointerException – это исключение времени выполнения, которое генерируется, когда вы пытаетесь вызвать метод или получить доступ к свойству (называемому разыменованием) в переменной, значение которой равно null.

Вы не можете игнорировать NullPointerException, так как это может привести к сбою вашего приложения Android и непредсказуемо.

В Java, чтобы избежать NullPointerException, всякий раз, когда вы вызываете метод для переменной, которая, как вы подозреваете, может быть нулевой, вам нужно будет добавить проверку на нуль.

Одна из основных целей Kotlin — максимально устранить это исключение NullPointerException (NPE), используя идею Null-безопасности. Итак, в Kotlin вы не увидите NPE, если только вы вручную и сознательно не облажаетесь.

Как Kotlin предотвращает исключение NullPointerException?

Помимо того, что Kotlin безопасен для типов, он также безопасен для нулей. Это означает, что компилятор заранее знает, может ли возвращаемое значение переменной или функции быть нулевым или нет.

По умолчанию все переменные не обнуляемые, если только вы не пометите их как обнуляемые с помощью оператора ?. Вот как это работает в коде:

Как вы можете видеть в коде, вы можете объявить переменную Nullable, поставив ? рядом с ее типом.

И если вы попытаетесь присвоить значение Null переменной Non-nullable, вы получите ошибку при написании самого кода.

Это относится и к функциям:

Как быть с «нулевыми» значениями (переменными, допускающими значение Null) в Kotlin?

Если переменная имеет тип Non-nullable, вы можете продолжить и получить к ней доступ к функциям и свойствам, это гарантирует, что не будет выброшено NPE.

Но если это Nullable, Kotlin не позволит вам вызвать функцию для него напрямую без проверки на null. Вот как вы можете это сделать:

Старая добрая проверка if/else на null

Ну, вы можете использовать обычную проверку нуля, как в Java, используя if/else.

Оператор безопасного вызова (?.)

Приведенный выше метод работает, но у kotlin есть лучшие способы сделать это: с помощью оператора Null-check (?.). Вы можете переписать приведенный выше код с нулевой проверкой

Чистый. Разве это не так?

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

Много раз вы хотите выполнить операцию над переменной Nullable, а затем назначить ее переменной Non-Nullable, как это

Как вы можете видеть в приведенном выше коде, Kotlin этого не допустит, так как toLowerCase() не будет вызываться, если name является null, таким образом присваивая null lowerName, которое не может быть нулевым.

Здесь вы используете Элвис-оператор(:?). С оператором Элвиса вы можете указать значение по умолчанию, которое будет возвращено вместо нуля, если в случае, если результатом блока кода будет null.

«let ” block: запустить блок кода с нулевой проверкой

Оператор проверки нуля подходит, если вы хотите вызвать один метод, но если вы хотите запустить блок кода, только если определенная переменная не равна нулю, вы можете использовать let (который является одним из функции Scoped).

Как вы можете видеть в приведенном выше примере, мы использовали it вместо фактического имени переменной, потому что it дает ненулевую версию фактической переменной.

«!!» (ненулевое утверждение) оператор: преобразование переменной Nullable в Non-nullable.

Если вы хотите преобразовать переменную Nullable в тип Non-nullable, вы можете использовать оператор !!.

Как вы можете видеть в примере, вы можете (принудительно) преобразовать переменную Nullable в тип Non-nullable.

Как я уже говорил ранее в этом посте, здесь вы можете облажаться.

Если значение переменной вы применяете !! operator имеет значение null, вы можете получить NullPointerException, что приведет к сбою вашего приложения. Поэтому используйте это только тогда, когда вам это очень нужно, и вы абсолютно уверены, что значение не будет нулевым.

Что ж, я надеюсь, что это дало вам некоторое представление о том, как можно легко справиться с нулевым значением в Kotlin. Если это полезно, пожалуйста, поделитесь и похлопайте