Назад к вопросам
Junior
70
questionbank

Для чего используются два восклицательных знака в программировании?

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 в точке вызова.