Ответ
Тип с вопросительным знаком (?) в Kotlin обозначает nullable-тип, то есть переменная может хранить либо значение указанного типа, либо null.
Пример:
var name: String? = null // Допустимо null
name = "Alex" // Или строку
Без ? переменная не может быть null:
var name: String = "Alex" // Ошибка, если попытаться присвоить null
Особенности:
- Требует проверки на
nullперед использованием (if,?.,!!,?:) - Позволяет избежать
NullPointerExceptionна этапе компиляции - Часто используется в Android при работе с API, где поля могут отсутствовать
Ответ 18+ 🔞
А, ну это про вопросик в Котлине! Давай разжую, как есть, без этих заумных мануалов.
Смотри, когда ты пишешь String? — это как будто ты говоришь компилятору: «Слушай, чувак, эта переменная — хитрая жопа. Она может быть нормальной строкой, а может быть просто пустым местом, нихуя не значением». То есть null.
Вот пример, чтобы не ебать тебе мозг:
var имя: String? = null // Ну вот, поставил null — и всё ок, не ругается
имя = "Сашка" // А теперь присвоил реальное значение — тоже ок
А если ты этот вопросик уберёшь, то это уже строгий папаша:
var имя: String = "Сашка" // Тут всё чётко, имя есть
// имя = null // А вот эту строчку попробуй раскомментировать — получишь пиздюлину от компилятора сразу! Он тебе: «Какого хуя? Я же тебе сказал — без null тут!»
И вся фишка в чём? В том, что Котлин — он не дурак. Он тебя заранее ловит за руку, ещё когда код пишешь, а не когда приложение на телефоне пользователя уже накрылось медным тазом с NullPointerException. Удивление пиздец, да? В Джве это было обычным делом — получил null там, где не ждал, и приложение — хлоп. А тут тебе система: «Э, сабака сука, э бошка думай! Ты эту nullable-переменную проверил на null или как?»
Проверять можно по-разному:
if (имя != null) { ... }— классика, дедовский способ.имя?.length— безопасный вызов. Еслиимя—null, то и результат всего выражения будетnull, а не краш.имя!!.length— это когда ты на 146% уверен, что там неnull. Но если ошибся — получишьNPEи сам будешь виноват, крича «Ёпта!».имя ?: "Гость"— элвис-оператор. Если слеваnull, то используй значение справа. Проще некуда.
Особенно это всё овердохуища полезно в андроиде. Ты же знаешь, эти API-шки с сервера — они же как мартышлюшки, что хотят, то и шлют. Поле может быть, а может и не быть. Вот тут ? и спасает — объявил поле как nullable, обработал случай с null, и твоё приложение не бздит при каждом чихе сети. Доверия к этим API, блядь, ноль, поэтому и защищайся.
Короче, вопросик — это не просто синтаксис, это философия. «Будь готов к тому, что значения может и не быть». И компилятор тебя заставит быть готовым. Умно, чё.