Для чего используются два восклицательных знака в программировании?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Два восклицательных знака !! в Kotlin используются для unsafe cast (приведения типов без проверки).
// Пример unsafe cast
val value: Any? = "Hello"
val str: String = value as String // Обычное приведение, может бросить ClassCastException
val anotherStr: String = value!! as String // Unsafe cast. Если value не String, тоже бросит ClassCastException, но синтаксис !! применяется к nullability
Основное назначение !! — преобразование нуллабельного типа в ненуллабельный, явно заявляя, что разработчик уверен, что переменная не будет null в данный момент выполнения.
// Пример использования !! для преобразования нуллабельного в ненуллабельный
var name: String? = "Kotlin"
val length: Int = name!!.length // Явно говорим, что name не null
Если при выполнении кода переменная, к которой применено !!, окажется null, будет брошена исключительная ситуация KotlinNullPointerException.
Это следует использовать осторожно, только когда на 100% уверены в отсутствии null. В большинстве случаев предпочтительнее использовать более безопасные механизмы, такие как:
- Оператор безопасного вызова:
?. - Оператор Элвиса:
?: - Проверка на
null(if (variable != null)) - Функции
let,run,also,applyс проверкой наnull
// Примеры безопасного обращения с null
var surname: String? = null
val lenSafeCall: Int? = surname?.length // Оператор безопасного вызова, вернет null если surname null
val lenElvis: Int = surname?.length ?: 0 // Оператор Элвиса, вернет 0 если surname null
if (surname != null) {
val lenIf: Int = surname.length // Умный каст после проверки
}
surname?.let {
// Код выполнится только если surname не null
val lenLet: Int = it.length
}
Таким образом, !! — это инструмент для преобразования нуллабельного типа в ненуллабельный, несущий риски NullPointerException и использующийся для явного утверждения отсутствия null в точке вызова.